001 package net.sf.tacos.javascript.jquery.components; 002 003 import java.util.HashMap; 004 import java.util.List; 005 import java.util.Map; 006 import org.apache.tapestry.IMarkupWriter; 007 import org.apache.tapestry.IRequestCycle; 008 import org.apache.tapestry.PageRenderSupport; 009 import org.apache.tapestry.Tapestry; 010 import org.apache.tapestry.TapestryUtils; 011 import org.apache.tapestry.dojo.form.Autocompleter; 012 import org.apache.tapestry.dojo.form.IAutocompleteModel; 013 import org.apache.tapestry.engine.DirectServiceParameter; 014 import org.apache.tapestry.engine.ILink; 015 import org.apache.tapestry.json.JSONObject; 016 import org.apache.tapestry.valid.ValidatorException; 017 018 public abstract class JqueryAutocompleter extends Autocompleter { 019 020 protected void renderFormWidget(IMarkupWriter writer, IRequestCycle cycle) 021 { 022 IAutocompleteModel model = getModel(); 023 if (model == null) 024 throw Tapestry.createRequiredParameterException(this, "model"); 025 026 Object value = getValue(); 027 Object key = value != null && !"".equals(value.toString()) ? model.getPrimaryKey(value) : null; 028 029 renderDelegatePrefix(writer, cycle); 030 031 writer.beginEmpty("input"); 032 writer.attribute("name", getName()); 033 writer.attribute("autocomplete", "off"); // turn off native html autocomplete 034 035 if (isDisabled()) 036 writer.attribute("disabled", "disabled"); 037 038 renderIdAttribute(writer, cycle); 039 040 renderDelegateAttributes(writer, cycle); 041 042 getValidatableFieldSupport().renderContributions(this, writer, cycle); 043 044 // Apply informal attributes. 045 renderInformalParameters(writer, cycle); 046 047 //writer.print(" "); 048 049 if (isLocal()) 050 { 051 List list = model.getValues(""); 052 for (int i=0; i<list.size(); i++) 053 { 054 /*Object optionKey = model.getPrimaryKey(list.get(i)); 055 056 writer.begin("option"); 057 writer.attribute("value", getDataSqueezer().squeeze(optionKey)); 058 059 if (optionKey!=null && optionKey.equals(key)) 060 writer.attribute("selected", "selected"); 061 062 writer.print(model.getLabelFor(list.get(i))); 063 writer.end();*/ 064 } 065 } 066 067 //writer.end(); 068 renderDelegateSuffix(writer, cycle); 069 070 Map parms = new HashMap(); 071 parms.put("id", getClientId()); 072 073 JSONObject json = new JSONObject(); 074 if (!isLocal()) 075 { 076 ILink link = getDirectService().getLink(true, new DirectServiceParameter(this)); 077 parms.put("url", link.getURL()); 078 } 079 080 json.put("mode", isLocal() ? "local" : "remote"); 081 json.put("widgetId", getName()); 082 json.put("name", getName()); 083 json.put("searchDelay", getSearchDelay()); 084 json.put("fadeTime", getFadeTime()); 085 json.put("maxListLength", getMaxListLength()); 086 json.put("forceValidOption", isForceValidOption()); 087 json.put("disabled", isDisabled()); 088 json.put("autoComplete", getAutoCompleteField()); 089 090 json.put("value", key != null ? getDataSqueezer().squeeze(key) : ""); 091 json.put("label", value != null ? model.getLabelFor(value) : ""); 092 093 parms.put("props", json.toString()); 094 parms.put("form", getForm().getName()); 095 parms.put("widget", this); 096 097 PageRenderSupport prs = TapestryUtils.getPageRenderSupport(cycle, this); 098 getScript().execute(this, cycle, prs, parms); 099 } 100 101 protected void rewindFormWidget(IMarkupWriter writer, IRequestCycle cycle) 102 { 103 String value = cycle.getParameter(getName()); 104 105 Object object = null; 106 107 try 108 { 109 if (value != null && value.length() > 0) { 110 //object = getModel().getValue(getDataSqueezer().unsqueeze(value)); 111 List list = getModel().getValues(value); 112 if (list!=null && list.size()>0) { 113 object = list.get(0); 114 } 115 } 116 117 getValidatableFieldSupport().validate(this, writer, cycle, object); 118 119 setValue(object); 120 } 121 catch (ValidatorException e) 122 { 123 getForm().getDelegate().record(e); 124 } 125 } 126 127 public void trigger(IRequestCycle cycle) 128 { 129 setFilter(cycle.getParameter("q")); 130 } 131 132 public boolean isJson() 133 { 134 return true; 135 } 136 137 }