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;
         }