228 lines
5.9 KiB
Java
228 lines
5.9 KiB
Java
/*
|
|
* To change this template, choose Tools | Templates
|
|
* and open the template in the editor.
|
|
*/
|
|
package com.rjconsultores.ventaboletos.web.utilerias;
|
|
|
|
import java.math.BigDecimal;
|
|
import org.zkoss.util.resource.Labels;
|
|
import org.zkoss.zk.ui.Component;
|
|
import org.zkoss.zk.ui.WrongValueException;
|
|
import org.zkoss.zk.ui.event.Event;
|
|
import org.zkoss.zk.ui.event.EventListener;
|
|
import org.zkoss.zk.ui.event.InputEvent;
|
|
import org.zkoss.zk.ui.ext.AfterCompose;
|
|
import org.zkoss.zk.ui.util.Clients;
|
|
import org.zkoss.zul.Constraint;
|
|
import org.zkoss.zul.Textbox;
|
|
|
|
/**
|
|
* Textbox con validaciones de valores numericos.
|
|
*
|
|
* Validaciones extras: maxValue - Indica cuál es el valor máximo permitido en
|
|
* el campo precision - Cuál es la precision de número scale - Cuál es la scala
|
|
* obligatorio - Indica se es obligatorio. El valo inicial es false. allowZero -
|
|
* Indica si es permitido valor cero allowNegative -Indica si es permitido
|
|
* valores negativos defaultZero - Indica se el valor inicial es cero
|
|
*
|
|
*
|
|
* Además de las validaciones extras, si puede ocupar las validaciones del ZK
|
|
* (no emptu, etc)
|
|
*
|
|
* @author gleimar
|
|
*/
|
|
public class MyTextboxDecimal extends Textbox implements AfterCompose {
|
|
|
|
private static final long serialVersionUID = 1L;
|
|
private String maxValue;
|
|
private Integer precision;
|
|
private Integer scale;
|
|
private Boolean obligatorio = false;
|
|
private Boolean allowZero = false;
|
|
private Boolean allowNegative = true;
|
|
private Boolean defaultZero = false;
|
|
private Constraint myConstraint;
|
|
private Constraint constraintTag; // variable con las constraints informadas
|
|
// en constraint="no empty"
|
|
|
|
public MyTextboxDecimal(String value) throws WrongValueException {
|
|
super(value);
|
|
this.registrarEventos();
|
|
}
|
|
|
|
public MyTextboxDecimal() {
|
|
this.registrarEventos();
|
|
}
|
|
|
|
private void registrarEventos() {
|
|
|
|
this.addEventListener("onChanging", new EventListener() {
|
|
|
|
public void onEvent(Event event) throws Exception {
|
|
if (event instanceof InputEvent) {
|
|
|
|
InputEvent ev = (InputEvent) event;
|
|
String val = ev.getValue();
|
|
myConstraint.validate(MyTextboxDecimal.this, val);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
private BigDecimal getBigDecimal(String val) {
|
|
if ((val == null) || (val.trim().equals(""))) {
|
|
return (BigDecimal) null;
|
|
}
|
|
val = val.trim();
|
|
|
|
boolean negativo = val.startsWith("-");
|
|
if (negativo) {
|
|
val = val.replace("-", "").replaceAll(",", "");
|
|
return (val.isEmpty() ? (BigDecimal) null : new BigDecimal(val).negate());
|
|
} else {
|
|
return new BigDecimal(val.replaceAll(",", ""));
|
|
}
|
|
}
|
|
|
|
private void aplicarMascara() {
|
|
Clients.evalJavaScript("jQuery('#" + this.getUuid()
|
|
+ "').maskMoney({allowZero:" + allowZero + ", allowNegative:"
|
|
+ allowNegative + ", defaultZero:" + defaultZero
|
|
+ ",thousands:',', decimal:'.', precision:" + (scale == null ? 2 : scale) + "})");
|
|
}
|
|
|
|
public String getMaxValue() {
|
|
return maxValue;
|
|
}
|
|
|
|
public void setMaxValue(String maxValue) {
|
|
this.maxValue = maxValue;
|
|
}
|
|
|
|
public Boolean getObligatorio() {
|
|
return obligatorio;
|
|
}
|
|
|
|
public void setObligatorio(Boolean obligatorio) {
|
|
this.obligatorio = obligatorio;
|
|
}
|
|
|
|
public Integer getPrecision() {
|
|
return precision;
|
|
}
|
|
|
|
public void setPrecision(Integer precision) {
|
|
this.precision = precision;
|
|
}
|
|
|
|
public Integer getScale() {
|
|
return scale;
|
|
}
|
|
|
|
public void setScale(Integer scale) {
|
|
this.scale = scale;
|
|
}
|
|
|
|
public BigDecimal getValueDecimal() {
|
|
return this.getBigDecimal(this.getValue());
|
|
}
|
|
|
|
public Boolean getAllowZero() {
|
|
return allowZero;
|
|
}
|
|
|
|
public void setAllowZero(Boolean allowZero) {
|
|
this.allowZero = allowZero;
|
|
}
|
|
|
|
public Boolean getDefaultZero() {
|
|
return defaultZero;
|
|
}
|
|
|
|
public void setDefaultZero(Boolean defaultZero) {
|
|
this.defaultZero = defaultZero;
|
|
}
|
|
|
|
public void afterCompose() {
|
|
aplicarMascara();
|
|
|
|
myConstraint = new MyTextboxDecimalConstraint();
|
|
|
|
super.setConstraint(myConstraint);
|
|
}
|
|
|
|
/**
|
|
* Agrega la constraint a las validaciones que ya existen
|
|
*
|
|
* @param Constraint
|
|
* - La constraint que se va a agregar
|
|
*/
|
|
@Override
|
|
public void setConstraint(Constraint c) {
|
|
if ((c instanceof MyTextboxDecimalConstraint) || (c == null)) {
|
|
super.setConstraint(c);
|
|
} else {
|
|
this.constraintTag = c;
|
|
}
|
|
}
|
|
|
|
public Boolean getAllowNegative() {
|
|
return allowNegative;
|
|
}
|
|
|
|
public void setAllowNegative(Boolean allowNegative) {
|
|
this.allowNegative = allowNegative;
|
|
}
|
|
|
|
class MyTextboxDecimalConstraint implements Constraint {
|
|
@Override
|
|
public void validate(Component comp, Object oVal)
|
|
throws WrongValueException {
|
|
|
|
// Si fue informado alguna constraint, esa es validada primer
|
|
if (constraintTag != null) {
|
|
constraintTag.validate(comp, oVal);
|
|
}
|
|
|
|
String val = oVal.toString();
|
|
if (obligatorio && ((val == null) || (val.trim().equals("")))) {
|
|
throw new WrongValueException(
|
|
comp,
|
|
Labels.getLabel("MSG.CONSTRAINT.CONSTRAINTNUMBERBDOBLIGATORIO"));
|
|
} else if (maxValue != null) {
|
|
BigDecimal bd = getBigDecimal(val);
|
|
|
|
if (bd == null) {
|
|
return;
|
|
}
|
|
BigDecimal bdMaxValue = new BigDecimal(maxValue);
|
|
|
|
if (bd.compareTo(bdMaxValue) > 0) {
|
|
MyTextboxDecimal.this.setRawValue((String) null);
|
|
Constraint c = getConstraint();
|
|
setConstraint((String) null);
|
|
MyTextboxDecimal.this.setText((String) null);
|
|
setConstraint(c);
|
|
throw new WrongValueException(comp, "El valor maximo permitido es " + maxValue);
|
|
}
|
|
} else if ((precision != null) && (scale != null)) {
|
|
BigDecimal valor = getBigDecimal(val);
|
|
|
|
if (valor == null) {
|
|
return;
|
|
}
|
|
|
|
if ((valor.precision() > precision) || (valor.scale() > scale)) {
|
|
MyTextboxDecimal.this.setRawValue((String) null);
|
|
Constraint c = getConstraint();
|
|
setConstraint((String) null);
|
|
MyTextboxDecimal.this.setText((String) null);
|
|
setConstraint(c);
|
|
throw new WrongValueException(comp, Labels.getLabel(
|
|
"MSG.CONSTRAINT.CONSTRAINTNUMBERBD", new Object[] { precision - 2, scale }));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|