You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2013/02/25 12:54:30 UTC

git commit: WICKET-5055

Updated Branches:
  refs/heads/master 5a3e0b7d4 -> 80735f84c


WICKET-5055

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/80735f84
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/80735f84
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/80735f84

Branch: refs/heads/master
Commit: 80735f84c2e22b084ceda95a55d43ae33390983d
Parents: 5a3e0b7
Author: svenmeier <sv...@apache.org>
Authored: Mon Feb 25 12:51:24 2013 +0100
Committer: svenmeier <sv...@apache.org>
Committed: Mon Feb 25 12:51:24 2013 +0100

----------------------------------------------------------------------
 .../examples/ajax/builtin/AutoCompletePage.html    |    5 +-
 .../examples/ajax/builtin/AutoCompletePage.java    |   48 ++++++++---
 .../html/autocomplete/wicket-autocomplete.js       |   64 ++++++++-------
 3 files changed, 74 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/80735f84/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AutoCompletePage.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AutoCompletePage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AutoCompletePage.html
index 59cebd7..9998bcf 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AutoCompletePage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AutoCompletePage.html
@@ -26,8 +26,11 @@
 		The textfield below will autocomplete country names. It utilizes AutoCompleteTextField in wicket-extensions.<br/><br/>
 
 		<form wicket:id="form">
-			Selected value is: <span wicket:id="selectedValue"></span><br/>
 			Country: <input type="text" wicket:id="ac" size="50"/>
+			<br/>
+			History of selected values:
+			<br/>
+			<div wicket:id="history"></div>
 		</form>
 
 		</wicket:extend>

http://git-wip-us.apache.org/repos/asf/wicket/blob/80735f84/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AutoCompletePage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AutoCompletePage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AutoCompletePage.java
index a2749c4..f5ab863 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AutoCompletePage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AutoCompletePage.java
@@ -22,13 +22,13 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 
-import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
 import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
-import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.basic.MultiLineLabel;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.model.Model;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.util.string.Strings;
 
 
@@ -39,6 +39,9 @@ import org.apache.wicket.util.string.Strings;
  */
 public class AutoCompletePage extends BasePage
 {
+
+	private StringBuilder values = new StringBuilder();
+
 	/**
 	 * Constructor
 	 */
@@ -47,8 +50,32 @@ public class AutoCompletePage extends BasePage
 		Form<Void> form = new Form<Void>("form");
 		add(form);
 
-		final AutoCompleteTextField<String> field = new AutoCompleteTextField<String>("ac",
-			new Model<String>(""))
+		final IModel<String> model = new IModel<String>()
+		{
+			private String value = null;
+
+			@Override
+			public String getObject()
+			{
+				return value;
+			}
+
+			@Override
+			public void setObject(String object)
+			{
+				value = object;
+
+				values.append("\n");
+				values.append(value);
+			}
+
+			@Override
+			public void detach()
+			{
+			}
+		};
+
+		final AutoCompleteTextField<String> field = new AutoCompleteTextField<String>("ac", model)
 		{
 			@Override
 			protected Iterator<String> getChoices(String input)
@@ -82,16 +109,9 @@ public class AutoCompletePage extends BasePage
 		};
 		form.add(field);
 
-		final Label label = new Label("selectedValue", field.getDefaultModel());
+		final MultiLineLabel label = new MultiLineLabel("history", new PropertyModel<String>(this,
+			"values"));
 		label.setOutputMarkupId(true);
-		label.add(new AjaxEventBehavior("click")
-		{
-			@Override
-			protected void onEvent(AjaxRequestTarget target)
-			{
-				target.add(field);
-			}
-		});
 		form.add(label);
 
 		field.add(new AjaxFormSubmitBehavior(form, "change")

http://git-wip-us.apache.org/repos/asf/wicket/blob/80735f84/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js
index ee654e7..0c29ccb 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js
@@ -50,8 +50,11 @@
 		var selected=-1;	// index of the currently selected item
 		var elementCount=0; // number of items on the auto complete list
 		var visible=0;		// is the list visible
-		var mouseactive=0;	// is mouse selection active
-		var	hidingAutocomplete=0;		// are we hiding the autocomplete list
+		
+		var ignoreFocus = false;		// ignore focus and gain because menu is showing
+		var	ignoreKeyEnter = false;		// ignore key ENTER because is already hid the autocomplete list
+		var ignoreOneFocusGain = false; // on FF, clicking an option in the pop-up would make field loose focus; focus() call only has effect in FF after popup is hidden, so the re-focusing must not show popup again in this case
+		var ignoreChange = false;		// ignore change event because TAB or ENTER event already triggered a change  
 
 		var initialElement;
 
@@ -69,8 +72,6 @@
 		// used for IE fix with hideShowCovered() - to be able to call it when bounds change while popup is visible.
 		var lastStablePopupBounds = [0, 0, 0, 0];
 
-		var ignoreOneFocusGain = false; // on FF, clicking an option in the pop-up would make field loose focus; focus() call only has effect in FF after popup is hidden, so the re-focusing must not show popup again in this case
-
 		// holds a throttler, for not sending many requests if the user types
 		// too quickly.
 		var localThrottler = new Wicket.Throttler(true);
@@ -80,7 +81,7 @@
 			var isShowing = false;
 			// Remove the autocompletion menu if still present from
 			// a previous call. This is required to properly register
-			// the mouse event handler again (using the new stateful 'mouseactive'
+			// the mouse event handler again (using the new stateful 'ignoreFocus'
 			// variable which just gets created)
 			var choiceDiv = document.getElementById(getMenuId());
 			if (choiceDiv !== null) {
@@ -92,7 +93,7 @@
 			initialElement = obj;
 
 			Wicket.Event.add(obj, 'blur', function (jqEvent) {
-				if (mouseactive === 1) {
+				if (ignoreFocus) {
 					ignoreOneFocusGain = true;
 					Wicket.$(elementId).focus();
 					return jqEvent.stopPropagation();
@@ -102,7 +103,7 @@
 			});
 
 			Wicket.Event.add(obj, 'focus', function (jqEvent) {
-				if (mouseactive === 1) {
+				if (ignoreFocus) {
 					ignoreOneFocusGain = false;
 					return jqEvent.stopPropagation();
 				}
@@ -143,7 +144,7 @@
 							render(true, false);
 							showAutoComplete();
 						}
-						if(Wicket.Browser.isSafari()) {
+						if (Wicket.Browser.isSafari()) {
 							return jqEvent.stopPropagation();
 						}
 						break;
@@ -155,20 +156,27 @@
 						break;
 					case KEY_TAB:
 					case KEY_ENTER:
-						if(selected > -1) {
+						ignoreChange = false;
+						ignoreKeyEnter = false;
+						
+						if (selected > -1) {
 							var value = getSelectedValue();
 							value = handleSelection(value);
+							
 							hideAutoComplete();
-							hidingAutocomplete = 1;
-							if(value) {
+							
+							if (value) {
 								obj.value = value;
 								jQuery(obj).triggerHandler('change');
+								ignoreChange = true;
 							}
+							
+							ignoreKeyEnter = true;
 						} else if (Wicket.AutoCompleteSettings.enterHidesWithNoSelection) {
 							hideAutoComplete();
-							hidingAutocomplete = 1;
+							
+							ignoreKeyEnter = true;
 						}
-						mouseactive = 0;
 
 						return true;
 
@@ -177,7 +185,7 @@
 			});
 
 			Wicket.Event.add(obj, 'change', function (jqEvent) {
-				if (mouseactive) {
+				if (ignoreFocus || ignoreChange) {
 					// don't let any other change handler get this
 					jqEvent.stopImmediatePropagation();
 				}
@@ -204,12 +212,9 @@
 			});
 
 			Wicket.Event.add(obj, 'keypress', function (jqEvent) {
-				if(Wicket.Event.keyCode(jqEvent) === KEY_ENTER){
-					if(selected>-1 || hidingAutocomplete === 1){
-						hidingAutocomplete=0;
-						jqEvent.stopImmediatePropagation();
-						return false;
-					}
+				if(Wicket.Event.keyCode(jqEvent) === KEY_ENTER && ignoreKeyEnter){
+					jqEvent.stopImmediatePropagation();
+					return false;
 				}
 			});
 
@@ -230,7 +235,7 @@
 		{
 			// Remove the autocompletion menu if still present from
 			// a previous call. This is required to properly register
-			// the mouse event handler again (using the new stateful 'mouseactive'
+			// the mouse event handler again (using the new stateful 'ignoreFocus'
 			// variable which just gets created)
 			var choiceDiv=document.getElementById(getMenuId());
 			if (choiceDiv !== null) {
@@ -316,8 +321,8 @@
 
 
 				// WICKET-1350/WICKET-1351
-				container.onmouseout=function() {mouseactive=0;};
-				container.onmousemove=function() {mouseactive=1;};
+				container.onmouseout = function() {ignoreFocus = false;};
+				container.onmousemove = function() {ignoreFocus = true;};
 			}
 
 
@@ -426,9 +431,9 @@
 		}
 
 		function hideAutoComplete(){
-			visible=0;
+			visible = 0;
 			setSelected(-1);
-			mouseactive=0;
+			ignoreFocus = false;
 			var container = getAutocompleteContainer();
 			if (container)
 			{
@@ -603,15 +608,18 @@
 			}
 			element.innerHTML=resp;
 			var selectableElements = getSelectableElements();
-			if(selectableElements) {
+			if (selectableElements) {
 				elementCount=selectableElements.length;
 
 				var clickFunc = function(event) {
-					mouseactive = 0;
+					ignoreFocus = false;
+					ignoreChange = false;
+					
 					var value = getSelectedValue();
-					var input = Wicket.$(elementId);
 					value = handleSelection(value);
 					hideAutoComplete();
+					
+					var input = Wicket.$(elementId);
 					if (value) {
 						input.value = value;
 						jQuery(input).triggerHandler('change');