You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2008/06/25 16:39:07 UTC
svn commit: r671573 - in
/wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete:
AbstractAutoCompleteRenderer.java wicket-autocomplete.js
Author: ivaynberg
Date: Wed Jun 25 07:39:07 2008
New Revision: 671573
URL: http://svn.apache.org/viewvc?rev=671573&view=rev
Log:
WICKET-488
Modified:
wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteRenderer.java
wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js
Modified: wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteRenderer.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteRenderer.java?rev=671573&r1=671572&r2=671573&view=diff
==============================================================================
--- wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteRenderer.java (original)
+++ wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteRenderer.java Wed Jun 25 07:39:07 2008
@@ -51,8 +51,12 @@
}
textValue = textValue.replaceAll("\\\"", """);
- response.write("<li textvalue=\"" + textValue + "\">");
- renderChoice(object, response, criteria);
+ response.write("<li textvalue=\"" + textValue + "\"");
+ final CharSequence handler = getOnSelectJavascriptExpression(object);
+ if(handler != null)
+ response.write(" onselect=\"" + handler + '"');
+ response.write(">");
+ renderChoice(object, response, criteria);
response.write("</li>");
}
@@ -92,4 +96,49 @@
* @return the text value that will be set on the textbox if this assist is selected
*/
protected abstract String getTextValue(Object object);
+
+
+ /**
+ * Allows the execution of a custom javascript expression when an item is selected in the autocompleter popup (either by
+ * clicking on it or hitting enter on the current selection).
+ * <p/>
+ * The javascript to execute must be a javascript expression that will be processed using javascript's eval().
+ * The function should return the textvalue to copy it into the corresponding form input field (the default behavior).
+ *
+ * the current text value will be in variable 'input'.
+ *
+ * If the function returns <code>null</code> the chosen text value will be ignored.
+ * <p/>
+ * example 1:
+ * <pre>
+ * protected CharSequence getOnSelectJavascript(Address address)
+ * {
+ * final StringBuffer js = new StringBuffer();
+ * js.append("wicketGet('street').value ='" + address.getStreet() + "';");
+ * js.append("wicketGet('zipcode').value ='" + address.getZipCode() + "';");
+ * js.append("wicketGet('city').value ='" + address.getCity() + "';");
+ * js.append("input"); // <-- do not use return statement here!
+ * return js.toString();
+ * }
+ * </pre>
+ * example 2:
+ * <pre>
+ * protected CharSequence getOnSelectJavascript(Currency currency)
+ * {
+ * final StringBuffer js = new StringBuffer();
+ * js.append("val rate = ajaxGetExchangeRateForCurrency(currencySymbol);");
+ * js.append("if(rate == null) alert('exchange rate service currently not available');");
+ * js.append("rate");
+ * return js.toString();
+ * }
+ * </pre>
+ * Then the autocompleter popup will be closed.
+ *
+ * @param item the autocomplete item to get a custom javascript expression for
+ * @return javascript to execute on selection or <code>null</code> if default behavior is intented
+ */
+ protected CharSequence getOnSelectJavascriptExpression(Object item)
+ {
+ return null;
+ }
}
Modified: wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js?rev=671573&r1=671572&r2=671573&view=diff
==============================================================================
--- wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js (original)
+++ wicket/branches/wicket-1.3.x/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js Wed Jun 25 07:39:07 2008
@@ -124,22 +124,21 @@
return killEvent(event);
break;
case KEY_ENTER:
- if(selected>-1){
- obj.value=getSelectedValue();
- hideAutoComplete();
- hidingAutocomplete=1;
- if(typeof objonchange=="function")objonchange();
- } else if (Wicket.AutoCompleteSettings.enterHidesWithNoSelection==true) {
- hideAutoComplete();
- hidingAutocomplete=1;
- }
- mouseactive=0;
- if(typeof objonkeydown=="function")objonkeydown();
-
- if(selected>-1){
- //return killEvent(event);
- }
- return true;
+ if(selected > -1) {
+ var value = getSelectedValue();
+ if(handleSelection(value)) {
+ obj.value = value;
+ if(typeof objonchange=="function") objonchange();
+ }
+ hideAutoComplete();
+ hidingAutocomplete = 1;
+ } else if (Wicket.AutoCompleteSettings.enterHidesWithNoSelection) {
+ hideAutoComplete();
+ hidingAutocomplete = 1;
+ }
+ mouseactive = 0;
+ if(typeof objonkeydown=="function") objonkeydown();
+ return true;
break;
default:
}
@@ -177,6 +176,12 @@
}
}
+ function handleSelection(input) {
+ var menu = getAutocompleteMenu();
+ var attr = menu.firstChild.childNodes[selected].attributes['onselect'];
+ return attr ? eval(attr.value) : input;
+ }
+
function getMenuId() {
return elementId+"-autocomplete";
}
@@ -302,27 +307,30 @@
var element = getAutocompleteMenu();
element.innerHTML=resp;
if(element.firstChild && element.firstChild.childNodes) {
- elementCount=element.firstChild.childNodes.length;
+ elementCount=element.firstChild.childNodes.length;
- var clickFunc = function(event){
- mouseactive=0;
- wicketGet(elementId).value=getSelectedValue();
- if(typeof objonchange=="function")objonchange();
- hideAutoComplete();
- };
+ var clickFunc = function(event) {
+ mouseactive = 0;
+ var value = getSelectedValue();
+ if(value = handleSelection(value)) {
+ wicketGet(elementId).value = value;
+ if(typeof objonchange=="function") objonchange();
+ }
+ hideAutoComplete();
+ };
- var mouseOverFunc = function(event){
- selected = getElementIndex(this);
- render();
- showAutoComplete();
- };
-
- var node=element.firstChild.childNodes[0];
- for(var i=0;i<elementCount;i++){
- node.onclick = clickFunc;
- node.onmouseover = mouseOverFunc;
- node = node.nextSibling;
- }
+ var mouseOverFunc = function(event) {
+ selected = getElementIndex(this);
+ render();
+ showAutoComplete();
+ };
+
+ var node=element.firstChild.childNodes[0];
+ for(var i=0;i<elementCount;i++) {
+ node.onclick = clickFunc;
+ node.onmouseover = mouseOverFunc;
+ node = node.nextSibling;
+ }
} else {
elementCount=0;
}