Author: ivaynberg
Date: Wed Jun 25 07:34:36 2008
New Revision: 671569

URL: http://svn.apache.org/viewvc?rev=671569&view=rev
Log:
WICKET-488

Modified:
    
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteRenderer.java
    
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js

Modified: 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteRenderer.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteRenderer.java?rev=671569&r1=671568&r2=671569&view=diff
==============================================================================
--- 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteRenderer.java
 (original)
+++ 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/AbstractAutoCompleteRenderer.java
 Wed Jun 25 07:34:36 2008
@@ -53,7 +53,11 @@
                }
                textValue = textValue.replaceAll("\\\"", """);
 
-               response.write("<li textvalue=\"" + textValue + "\">");
+        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>");
        }
@@ -94,4 +98,48 @@
         * @return the text value that will be set on the textbox if this 
assist is selected
         */
        protected abstract String getTextValue(T 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 StringBuilder js = new StringBuilder();
+     *    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 StringBuilder js = new StringBuilder();
+     *    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(T item)
+    {
+      return null;
+    }
 }

Modified: 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js?rev=671569&r1=671568&r2=671569&view=diff
==============================================================================
--- 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js
 (original)
+++ 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js
 Wed Jun 25 07:34:36 2008
@@ -124,15 +124,18 @@
                        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;
-                                       }
+                    if(selected > -1) {
+                        var value = getSelectedValue();
+                        if(value = 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();
 
@@ -177,6 +180,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";
     }
@@ -216,6 +225,12 @@
         return node;
     }
     
+    function handleSelection(input) {
+        var menu = getAutocompleteMenu();
+        var attr = menu.firstChild.childNodes[selected].attributes['onselect'];
+        return attr ? eval(attr.value) : input;
+    }
+
     function killEvent(event){
         if(!event)event=window.event;
         if(!event)return false;
@@ -306,9 +321,12 @@
 
                var clickFunc = function(event){
                        mouseactive=0;
-                       wicketGet(elementId).value=getSelectedValue();
-                       if(typeof objonchange=="function")objonchange();
+                       var value = getSelectedValue();
+                       if(value = handleSelection(value)) {
+                               wicketGet(elementId).value=value;
+                               if (typeof objonchange=="function") 
{objonchange();}
                                hideAutoComplete();
+                       }
                };
                        
                var mouseOverFunc = function(event){


Reply via email to