/* * Copyright 2009 Rodrigo Reyes reyes.rr at gmail dot 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.kornr.swit.site.widget; import net.kornr.swit.site.jquery.JQuery; import org.apache.wicket.ResourceReference; import org.apache.wicket.markup.html.IHeaderContributor; import org.apache.wicket.markup.html.IHeaderResponse; import org.apache.wicket.markup.html.form.FormComponentPanel; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.model.IModel; import org.apache.wicket.resource.ContextRelativeResource; public class IntegerField extends FormComponentPanel<Double> implements IHeaderContributor { private static final long serialVersionUID = 1L; private static String s_enablenumeric = "$('#NUMBERFIELD').numeric();"; private static String s_enablenumeric_decimal = "$('#NUMBERFIELD').numeric({allow:'.'});"; private static String s_stepfn = "$(document).ready(function(){ $('#IMAGEID').bind('click', function() { $('#NUMBERFIELD').val(new Number($('#NUMBERFIELD').val()) + STEP); });});"; private static String s_stepfnminmax = "$(document).ready(function(){ $('#IMAGEID').bind('click', function() { var v = new Number($('#NUMBERFIELD').val()); v+= STEP; if ((v*100)%100 >0)v=v.toFixed(2); if (v<MIN) v=MIN; if (v>MAX)v=MAX; $('#NUMBERFIELD').val(v); });});"; private TextField<Double> m_numbertf; private Image m_inc, m_dec; private Number m_step; private Number m_max = null; private Number m_min = null; private boolean m_allowDecimal; static public class IntegerAdaptor implements IModel<Double> { private IModel<Integer> m_org; public IntegerAdaptor(IModel<Integer> model) { m_org = model; } public Double getObject() { return (double)m_org.getObject(); } public void setObject(Double object) { m_org.setObject(object.intValue()); } public void detach() { m_org.detach(); } } static public class FloatAdaptor implements IModel<Double> { private IModel<Float> m_org; public FloatAdaptor(IModel<Float> model) { m_org = model; } public Double getObject() { return (double)m_org.getObject(); } public void setObject(Double object) { m_org.setObject(object.floatValue()); } public void detach() { m_org.detach(); } } public IntegerField(String id, IModel<Double> model, Number step, boolean allowDecimal, Double min, Double max) { this(id, model, step, allowDecimal); m_min = Math.min(max, min); m_max = Math.max(max, min); } public IntegerField(String id, IModel<Double> model, Number step) { this(id,model,step,false); } public IntegerField(String id, IModel<Double> model, Number step, boolean allowDecimal) { super(id, model); m_step = step; m_allowDecimal = allowDecimal; m_numbertf = new TextField<Double>("number", model, Double.class) { @Override protected void convertInput() { String s = this.getInput(); Double d = new Double(IntegerField.this.getValue(s)); setConvertedInput(d); } @Override protected String getModelValue() { if (m_allowDecimal) { double d = this.getModelObject(); int rest = (int)((d*100)%100); if (rest==0) return Integer.toString((int)d); else return Double.toString(d); } else return Integer.toString(this.getModelObject().intValue()); } }; m_numbertf.setOutputMarkupId(true); add(m_numbertf); m_inc = new Image("inc", new ResourceReference(IntegerField.class, "small-arrow-up.png")); m_dec = new Image("dec", new ResourceReference(IntegerField.class, "small-arrow-down.png")); m_inc.setOutputMarkupId(true); m_dec.setOutputMarkupId(true); this.add(m_inc); this.add(m_dec); } @Override protected void convertInput() { Double d = m_numbertf.getConvertedInput(); this.setConvertedInput(d); } @Override public void updateModel() { Double d = m_numbertf.getConvertedInput(); this.setModelObject(d); } private double getValue(String str) { str = str.replace(" ", ""); str = str.replace(",", "."); return Double.parseDouble(str); } public void renderHead(IHeaderResponse response) { response.renderJavascriptReference(JQuery.getReference()); String stepcode = s_stepfn; if (m_min != null && m_max != null) stepcode = s_stepfnminmax; String javascriptcode = varreplace(stepcode, -m_step.floatValue(), m_dec.getMarkupId()) + varreplace(stepcode, m_step.floatValue(), m_inc.getMarkupId()); response.renderOnLoadJavascript(javascriptcode); String upurl = this.urlFor(new ResourceReference(IntegerField.class, "small-arrow-up.png")).toString(); String uphoverurl = this.urlFor(new ResourceReference(IntegerField.class, "small-arrow-up-hover.png")).toString(); String downurl = this.urlFor(new ResourceReference(IntegerField.class, "small-arrow-down.png")).toString(); String downhoverurl = this.urlFor(new ResourceReference(IntegerField.class, "small-arrow-down-hover.png")).toString(); String str = "$('#IMAGEID').mouseenter(function(){$('#IMAGEID').attr('src', '"+uphoverurl+"');});"; str += "$('#IMAGEID').mouseleave(function(){$('#IMAGEID').attr('src', '"+upurl+"');});"; response.renderOnLoadJavascript(varreplace(str,0,m_inc.getMarkupId())); str = "$('#IMAGEID').mouseenter(function(){$('#IMAGEID').attr('src', '"+downhoverurl+"');});"; str += "$('#IMAGEID').mouseleave(function(){$('#IMAGEID').attr('src', '"+downurl+"');});"; response.renderOnLoadJavascript(varreplace(str,0,m_dec.getMarkupId())); String chgevent_inc = "$('#"+m_inc.getMarkupId()+"').bind('click', function(){$('#"+m_numbertf.getMarkupId()+"').change()});"; String chgevent_dec = "$('#"+m_dec.getMarkupId()+"').bind('click', function(){$('#"+m_numbertf.getMarkupId()+"').change()});"; response.renderJavascript(JQuery.getOnReadyScript(chgevent_inc), null); response.renderJavascript(JQuery.getOnReadyScript(chgevent_dec), null); } public String getTextFieldMarkupId() { return m_numbertf.getMarkupId(); } private String varreplace(String str, float nb, String imgid) { return str.replace("IMAGEID", imgid).replace("NUMBERFIELD", m_numbertf.getMarkupId()).replace("STEP", Float.toString(nb)).replace("MIN", m_min!=null?m_min.toString():"").replace("MAX", m_min!=null?m_max.toString():""); } }