/*******************************************************************************
* Copyright 2011 Alex 'Ript' Malyshev <alexript@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package net.autosauler.ballance.client.gui;
import java.util.Date;
import net.autosauler.ballance.client.model.CatalogModel;
import net.autosauler.ballance.client.model.DocumentModel;
import net.autosauler.ballance.shared.datatypes.DataTypes;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.FieldEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.widget.form.CheckBox;
import com.extjs.gxt.ui.client.widget.form.DateField;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.form.PropertyEditor;
import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
import com.extjs.gxt.ui.client.widget.form.TextArea;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.CellEditor;
import com.google.gwt.i18n.client.DateTimeFormat;
/**
* The Class HeaderField.
*
* @author alexript
*/
public class HeaderField implements Listener<FieldEvent> {
/** The w. */
private Field<?> w;
/** The t. */
private final int t;
/** The defval. */
private final Object defval;
/** The mytag. */
private String mytag;
/** The h. */
private IFieldChangeHandler h;
private ITableFieldChangeHandler ch;
/**
* Instantiates a new header field.
*
* @param name
* the name
* @param widget
* the widget
* @param type
* the type
* @param defval
* the defval
*/
public HeaderField(String name, int type, Object defval, Object helper) {
super();
h = null;
this.defval = defval;
t = type;
createField(name, helper);
}
@SuppressWarnings("unchecked")
private void createField(String name, Object helper) {
if (t == DataTypes.DT_SCRIPT) {
w = new TextArea();
} else if (t == DataTypes.DT_STRING) {
w = new TextField<String>();
} else if (t == DataTypes.DT_CURRENCY) {
w = new CurrencySelector((String) defval);
} else if (t == DataTypes.DT_CATALOGRECORD) {
w = ((CatalogPanel) helper).getSelectBox((Long) defval);
} else if (t == DataTypes.DT_DOCUMENTRECORD) {
w = ((DocumentPanel) helper).getSelectBox((Long) defval);
} else if (t == DataTypes.DT_DATE) {
w = new DateField();
((DateField) w).setFormatValue(true);
((DateField) w).getPropertyEditor().setFormat(
DateTimeFormat.getFormat("yyyy/MM/dd"));
} else if (t == DataTypes.DT_MONEY) {
w = new TextField<Double>();
((TextField<Double>) w)
.setPropertyEditor(new PropertyEditor<Double>() {
@Override
public Double convertStringValue(String value) {
String v = value.trim().replace(',', '.');
return Double.parseDouble(v);
}
@Override
public String getStringValue(Double value) {
return value.toString();
}
});
} else if (t == DataTypes.DT_DOUBLE) {
w = new TextField<Double>();
((TextField<Double>) w)
.setPropertyEditor(new PropertyEditor<Double>() {
@Override
public Double convertStringValue(String value) {
String v = value.trim().replace(',', '.');
return Double.parseDouble(v);
}
@Override
public String getStringValue(Double value) {
return value.toString();
}
});
} else if (t == DataTypes.DT_INT) {
w = new TextField<Integer>();
((TextField<Integer>) w)
.setPropertyEditor(new PropertyEditor<Integer>() {
@Override
public Integer convertStringValue(String value) {
String v = value.trim();
return Integer.parseInt(v);
}
@Override
public String getStringValue(Integer value) {
return value.toString();
}
});
} else if (t == DataTypes.DT_LONG) {
w = new TextField<Long>();
((TextField<Long>) w).setPropertyEditor(new PropertyEditor<Long>() {
@Override
public Long convertStringValue(String value) {
String v = value.trim().replace(',', '.');
return Long.parseLong(v);
}
@Override
public String getStringValue(Long value) {
return value.toString();
}
});
} else if (t == DataTypes.DT_BOOLEAN) {
w = new CheckBox();
}
if (w == null) {
w = new TextField<String>();
// TODO: create widgets for all datatypes
}
w.setFieldLabel(name);
w.setAutoValidate(false);
}
public CellEditor getCellEditor() {
if (t == DataTypes.DT_CURRENCY) {
CellEditor e = new CellEditor(w) {
@SuppressWarnings("unchecked")
@Override
public Object postProcessValue(Object value) {
if (value == null) {
return value;
}
return ((SimpleComboValue<String>) value).get("value");
}
@Override
public Object preProcessValue(Object value) {
if (value == null) {
return value;
}
return ((CurrencySelector) w).findModel(value.toString());
}
};
return e;
} else if (t == DataTypes.DT_CATALOGRECORD) {
CellEditor e = new CellEditor(w) {
@Override
public Object postProcessValue(Object value) {
if (value == null) {
return value;
}
return ((CatalogModel) value).get("number");
}
@Override
public Object preProcessValue(Object value) {
if (value == null) {
return value;
}
return ((CatalogSelector) w).find((Long) value);
}
};
return e;
} else if (t == DataTypes.DT_DOCUMENTRECORD) {
CellEditor e = new CellEditor(w) {
@Override
public Object postProcessValue(Object value) {
if (value == null) {
return value;
}
DocumentModel model = (DocumentModel) value;
Long number = model.get("number");
return number;
}
@Override
public Object preProcessValue(Object value) {
if (value == null) {
return value;
}
return ((DocumentSelector) w).find((Long) value);
}
};
return e;
}
return new CellEditor(w);
}
public Field<?> getField() {
return w;
}
/**
* Gets the value.
*
* @return the value
*/
@SuppressWarnings("unchecked")
public Object getValue() {
Object o = null;
if (t == DataTypes.DT_SCRIPT) {
o = ((TextArea) w).getValue();
} else if (t == DataTypes.DT_STRING) {
o = ((TextField<String>) w).getValue();
} else if (t == DataTypes.DT_MONEY) {
o = ((TextField<Double>) w).getValue();
} else if (t == DataTypes.DT_DOUBLE) {
o = ((TextField<Double>) w).getValue();
} else if (t == DataTypes.DT_CURRENCY) {
o = ((CurrencySelector) w).getStrValue();
} else if (t == DataTypes.DT_CATALOGRECORD) {
o = ((CatalogSelector) w).getLongValue();
} else if (t == DataTypes.DT_DOCUMENTRECORD) {
o = ((DocumentSelector) w).getLongValue();
} else if (t == DataTypes.DT_DATE) {
o = ((DateField) w).getValue();
} else if (t == DataTypes.DT_INT) {
o = ((TextField<Integer>) w).getValue();
} else if (t == DataTypes.DT_LONG) {
o = ((TextField<Long>) w).getValue();
} else if (t == DataTypes.DT_BOOLEAN) {
o = ((CheckBox) w).getValue();
}
return DataTypes.toMapping(t, o);
}
/**
* Gets the value.
*
* @return the value
*/
@SuppressWarnings("unchecked")
public String getValueAsString() {
Object o = null;
if (t == DataTypes.DT_SCRIPT) {
o = ((TextArea) w).getValue();
} else if (t == DataTypes.DT_STRING) {
o = ((TextField<String>) w).getValue();
} else if (t == DataTypes.DT_MONEY) {
o = ((TextField<Double>) w).getValue();
} else if (t == DataTypes.DT_DOUBLE) {
o = ((TextField<Double>) w).getValue();
} else if (t == DataTypes.DT_CURRENCY) {
o = ((CurrencySelector) w).getStrValue();
} else if (t == DataTypes.DT_CATALOGRECORD) {
o = ((CatalogSelector) w).getLongValue();
} else if (t == DataTypes.DT_DOCUMENTRECORD) {
o = ((DocumentSelector) w).getLongValue();
} else if (t == DataTypes.DT_DATE) {
o = ((DateField) w).getValue();
} else if (t == DataTypes.DT_INT) {
o = ((TextField<Integer>) w).getValue();
} else if (t == DataTypes.DT_LONG) {
o = ((TextField<Long>) w).getValue();
} else if (t == DataTypes.DT_BOOLEAN) {
o = ((CheckBox) w).getValue();
}
return DataTypes.toString(t, o);
}
@SuppressWarnings("rawtypes")
@Override
public void handleEvent(FieldEvent be) {
if (h != null) {
h.handleFieldChange(mytag, getValueAsString());
}
if (ch != null) {
if (t == DataTypes.DT_CATALOGRECORD) {
ch.handleFieldChange(mytag,
((CatalogModel) be.getValue()).get("number"));
} else if (t == DataTypes.DT_DOCUMENTRECORD) {
ch.handleFieldChange(mytag,
((DocumentModel) be.getValue()).get("number"));
} else if (t == DataTypes.DT_CURRENCY) {
ch.handleFieldChange(mytag,
((SimpleComboValue) be.getValue()).get("value"));
} else {
ch.handleFieldChange(mytag, be.getValue());
}
}
}
/**
* Reset.
*/
public void reset() {
setValue(defval, false);
}
@SuppressWarnings({ "unchecked" })
public void setCellChangeHandler(String tag,
ITableFieldChangeHandler handler) {
mytag = tag;
ch = handler;
if (t == DataTypes.DT_STRING) {
((TextField<String>) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_MONEY) {
((TextField<Double>) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_DOUBLE) {
((TextField<Double>) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_CURRENCY) {
((CurrencySelector) w).addChangeHandler(this);
} else if (t == DataTypes.DT_CATALOGRECORD) {
((CatalogSelector) w).addChangeHandler(this);
} else if (t == DataTypes.DT_DOCUMENTRECORD) {
((DocumentSelector) w).addChangeHandler(this);
} else if (t == DataTypes.DT_DATE) {
((DateField) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_INT) {
((TextField<Integer>) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_LONG) {
((TextField<Long>) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_BOOLEAN) {
((CheckBox) w).addListener(Events.Change, this);
}
}
/**
* Sets the change handler.
*
* @param tag
* the tag
* @param handler
* the handler
*/
@SuppressWarnings({ "unchecked" })
public void setChangeHandler(String tag, IFieldChangeHandler handler) {
mytag = tag;
h = handler;
if (t == DataTypes.DT_STRING) {
((TextField<String>) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_MONEY) {
((TextField<Double>) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_DOUBLE) {
((TextField<Double>) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_CURRENCY) {
((CurrencySelector) w).addChangeHandler(this);
} else if (t == DataTypes.DT_CATALOGRECORD) {
((CatalogSelector) w).addChangeHandler(this);
} else if (t == DataTypes.DT_DOCUMENTRECORD) {
((DocumentSelector) w).addChangeHandler(this);
} else if (t == DataTypes.DT_DATE) {
((DateField) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_INT) {
((TextField<Integer>) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_LONG) {
((TextField<Long>) w).addListener(Events.Change, this);
} else if (t == DataTypes.DT_BOOLEAN) {
((CheckBox) w).addListener(Events.Change, this);
}
}
/**
* Sets the value.
*
* @param val
* the new value
* @param castfrommap
* the castfrommap
*/
@SuppressWarnings("unchecked")
public void setValue(Object val, boolean castfrommap) {
Object mval = val;
if (castfrommap) {
mval = DataTypes.fromMapping(t, val);
}
if (t == DataTypes.DT_SCRIPT) {
((TextArea) w).setValue((String) mval);
} else if (t == DataTypes.DT_STRING) {
((TextField<String>) w).setValue((String) mval);
} else if (t == DataTypes.DT_MONEY) {
if (mval == null) {
mval = 0.0d;
}
((TextField<Double>) w).setValue((Double) mval);
} else if (t == DataTypes.DT_DOUBLE) {
((TextField<Double>) w).setValue((Double) mval);
} else if (t == DataTypes.DT_CURRENCY) {
((CurrencySelector) w).select((String) mval);
} else if (t == DataTypes.DT_CATALOGRECORD) {
Long v = null;
try {
v = (Long) mval;
((CatalogSelector) w).select(v);
} catch (java.lang.ClassCastException e) {
((CatalogSelector) w).reset();
}
} else if (t == DataTypes.DT_DOCUMENTRECORD) {
Long v = null;
try {
v = (Long) mval;
((DocumentSelector) w).select(v);
} catch (java.lang.ClassCastException e) {
((DocumentSelector) w).reset();
}
} else if (t == DataTypes.DT_DATE) {
((DateField) w).setValue((Date) mval);
} else if (t == DataTypes.DT_INT) {
((TextField<Integer>) w).setValue((Integer) mval);
} else if (t == DataTypes.DT_LONG) {
((TextField<Long>) w).setValue((Long) mval);
} else if (t == DataTypes.DT_BOOLEAN) {
((CheckBox) w).setValue((Boolean) mval);
}
}
/**
* Sets the value.
*
* @param val
* the new value
* @param castfrommap
* the castfrommap
*/
@SuppressWarnings("unchecked")
public void setValue(String val, boolean castfrommap) {
Object mval = val;
if (castfrommap) {
mval = DataTypes.fromString(t, val);
}
if (t == DataTypes.DT_SCRIPT) {
((TextArea) w).setValue((String) mval);
} else if (t == DataTypes.DT_STRING) {
((TextField<String>) w).setValue((String) mval);
} else if (t == DataTypes.DT_MONEY) {
((TextField<Double>) w).setValue((Double) mval);
} else if (t == DataTypes.DT_DOUBLE) {
((TextField<Double>) w).setValue((Double) mval);
} else if (t == DataTypes.DT_CURRENCY) {
((CurrencySelector) w).select((String) mval);
} else if (t == DataTypes.DT_CATALOGRECORD) {
((CatalogSelector) w).select((Long) mval);
} else if (t == DataTypes.DT_DOCUMENTRECORD) {
((DocumentSelector) w).select((Long) mval);
} else if (t == DataTypes.DT_DATE) {
((DateField) w).setValue((Date) mval);
} else if (t == DataTypes.DT_INT) {
((TextField<Integer>) w).setValue((Integer) mval);
} else if (t == DataTypes.DT_LONG) {
((TextField<Long>) w).setValue((Long) mval);
} else if (t == DataTypes.DT_BOOLEAN) {
((CheckBox) w).setValue((Boolean) mval);
}
}
}