Author: nbelaevski
Date: 2010-08-17 15:30:38 -0400 (Tue, 17 Aug 2010)
New Revision: 18737
Added:
trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutocomplete.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteEncodeStrategy.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteBaseGradient.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteButtonGradient.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteFieldGradient.java
trunk/ui/input/ui/src/main/java/org/richfaces/view/facelets/AutocompleteHandler.java
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/Autocomplete.ecss
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/Autocomplete.js
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutocompleteBase.js
trunk/ui/input/ui/src/main/templates/autocomplete.template.xml
Removed:
trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutoComplete.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutoCompleteEncodeStrategy.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutoCompleteRendererBase.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteBaseGradient.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteButtonGradient.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteFieldGradient.java
trunk/ui/input/ui/src/main/java/org/richfaces/view/facelets/AutoCompleteHandler.java
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoComplete.ecss
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoComplete.js
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoCompleteBase.js
trunk/ui/input/ui/src/main/templates/autoComplete.template.xml
Modified:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteDivLayoutStrategy.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteGridLayoutStrategy.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteListLayoutStrategy.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteTableLayoutStrategy.java
Log:
RF-9096
Deleted:
trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutoComplete.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutoComplete.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutoComplete.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -1,259 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.component;
-
-import java.io.IOException;
-
-import javax.el.MethodExpression;
-import javax.el.ValueExpression;
-import javax.faces.application.Application;
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIInput;
-import javax.faces.component.visit.VisitCallback;
-import javax.faces.component.visit.VisitContext;
-import javax.faces.component.visit.VisitResult;
-import javax.faces.context.FacesContext;
-import javax.faces.convert.Converter;
-
-import org.ajax4jsf.util.ELUtils;
-import org.richfaces.cdk.annotations.Attribute;
-import org.richfaces.cdk.annotations.EventName;
-import org.richfaces.cdk.annotations.JsfComponent;
-import org.richfaces.cdk.annotations.JsfRenderer;
-import org.richfaces.cdk.annotations.Signature;
-import org.richfaces.cdk.annotations.Tag;
-import org.richfaces.cdk.annotations.TagType;
-import org.richfaces.context.ExtendedVisitContext;
-import org.richfaces.context.ExtendedVisitContextMode;
-import org.richfaces.renderkit.MetaComponentRenderer;
-
-/**
- * @author Nick Belaevski
- *
- */
-@JsfComponent(tag = @Tag(type = TagType.Facelets, handler =
"org.richfaces.view.facelets.AutoCompleteHandler"), renderer = @JsfRenderer(type
= "org.richfaces.AutoCompleteRenderer"))
-public abstract class AbstractAutoComplete extends UIInput implements
MetaComponentResolver, MetaComponentEncoder {
-
- public static final String ITEMS_META_COMPONENT_ID = "items";
-
- public static final String COMPONENT_TYPE = "org.richfaces.AutoComplete";
-
- public static final String COMPONENT_FAMILY = UIInput.COMPONENT_FAMILY;
-
- // TODO nick - change to Object -
https://jira.jboss.org/browse/RF-8897
- public abstract Object getAutocompleteList();
-
- @Attribute(signature = @Signature(returnType = Object.class, parameters =
{FacesContext.class, UIComponent.class, String.class}))
- public abstract MethodExpression getAutocompleteMethod();
-
- public abstract void setAutocompleteMethod(MethodExpression expression);
-
- public abstract void setItemConverter(Converter converter);
-
- @Attribute(literal = true)
- public abstract String getVar();
-
- // TODO nick - el-only?
- @Attribute(literal = false)
- public abstract Object getFetchValue();
-
- @Attribute(defaultValue = "1")
- public abstract int getMinChars();
-
- @Attribute
- public abstract String getFilterFunction();
-
- @Attribute(defaultValue = "rf-au-c")
- public abstract String getSelectedItemClass();
-
- @Attribute
- public abstract String getMode();
-
- @Attribute
- public abstract String getLayout();
-
- @Attribute
- public abstract Converter getItemConverter();
-
- @Attribute(defaultValue = "false")
- public abstract boolean isAutoFill();
-
- @Attribute(defaultValue = "false")
- public abstract boolean isDisabled();
-
- @Attribute(defaultValue = "false")
- public abstract boolean isShowButton();
-
- @Attribute(defaultValue = "false")
- public abstract boolean isSelectFirst();
-
- @Attribute(events = @EventName("click"))
- public abstract String getOnclick();
-
- @Attribute(events = @EventName("dblclick"))
- public abstract String getOndblclick();
-
- @Attribute(events = @EventName("mousedown"))
- public abstract String getOnmousedown();
-
- @Attribute(events = @EventName("mouseup"))
- public abstract String getOnmouseup();
-
- @Attribute(events = @EventName("mouseover"))
- public abstract String getOnmouseover();
-
- @Attribute(events = @EventName("mousemove"))
- public abstract String getOnmousemove();
-
- @Attribute(events = @EventName("mouseout"))
- public abstract String getOnmouseout();
-
- @Attribute(events = @EventName("keypress"))
- public abstract String getOnkeypress();
-
- @Attribute(events = @EventName("keydown"))
- public abstract String getOnkeydown();
-
- @Attribute(events = @EventName("keyup"))
- public abstract String getOnkeyup();
-
- @Attribute(events = @EventName("listclick"))
- public abstract String getOnlistclick();
-
- @Attribute(events = @EventName("listdblclick"))
- public abstract String getOnlistdblclick();
-
- @Attribute(events = @EventName("listmousedown"))
- public abstract String getOnlistmousedown();
-
- @Attribute(events = @EventName("listmouseup"))
- public abstract String getOnlistmouseup();
-
- @Attribute(events = @EventName("listmouseover"))
- public abstract String getOnlistmouseover();
-
- @Attribute(events = @EventName("listmousemove"))
- public abstract String getOnlistmousemove();
-
- @Attribute(events = @EventName("listmouseout"))
- public abstract String getOnlistmouseout();
-
- @Attribute(events = @EventName("listkeypress"))
- public abstract String getOnlistkeypress();
-
- @Attribute(events = @EventName("listkeydown"))
- public abstract String getOnlistkeydown();
-
- @Attribute(events = @EventName("listkeyup"))
- public abstract String getOnlistkeyup();
-
- @Attribute(events = @EventName("change"))
- public abstract String getOnchange();
-
- @Attribute(events = @EventName("blur"))
- public abstract String getOnblur();
-
- @Attribute(events = @EventName("focus"))
- public abstract String getOnfocus();
-
- @Attribute(events = @EventName("listblur"))
- public abstract String getOnlistblur();
-
- @Attribute(events = @EventName("listfocus"))
- public abstract String getOnlistfocus();
-
- @Attribute(events = @EventName("begin"))
- public abstract String getOnbegin();
-
- @Attribute(events = @EventName("error"))
- public abstract String getOnerror();
-
- @Attribute(events = @EventName("complete"))
- public abstract String getOncomplete();
-
- @Attribute(events = @EventName("beforedomupdate"))
- public abstract String getOnbeforedomupdate();
-
- @Override
- public Converter getConverter() {
- Converter converter = super.getConverter();
- if (converter == null) {
- converter = getConverterForValue(FacesContext.getCurrentInstance());
- }
-
- return converter;
- }
-
- private Converter getConverterForType(FacesContext context, Class<?> type) {
-
- if (!Object.class.equals(type) && type != null) {
- Application application = context.getApplication();
- return application.createConverter(type);
- }
-
- return null;
- }
-
- public Converter getConverterForValue(FacesContext context) {
- Converter converter = null;
- ValueExpression expression = this.getValueExpression("value");
-
- if (expression != null) {
- Class<?> containerClass = ELUtils.getContainerClass(context,
expression);
-
- converter = getConverterForType(context, containerClass);
- }
-
- return converter;
- }
-
- public String resolveClientId(FacesContext facesContext, UIComponent
contextComponent, String metaComponentId) {
- if (ITEMS_META_COMPONENT_ID.equals(metaComponentId)) {
- return getClientId(facesContext) +
MetaComponentResolver.META_COMPONENT_SEPARATOR_CHAR + metaComponentId;
- }
-
- return null;
- }
-
- @Override
- public boolean visitTree(VisitContext context, VisitCallback callback) {
- if (context instanceof ExtendedVisitContext) {
- ExtendedVisitContext extendedVisitContext = (ExtendedVisitContext) context;
- if (extendedVisitContext.getVisitMode() == ExtendedVisitContextMode.RENDER)
{
-
- VisitResult result =
extendedVisitContext.invokeMetaComponentVisitCallback(this, callback,
- ITEMS_META_COMPONENT_ID);
- if (result == VisitResult.COMPLETE) {
- return true;
- } else if (result == VisitResult.REJECT) {
- return false;
- }
- }
- }
-
- return super.visitTree(context, callback);
- }
-
- public void encodeMetaComponent(FacesContext context, String metaComponentId) throws
IOException {
- ((MetaComponentRenderer) getRenderer(context)).encodeMetaComponent(context, this,
metaComponentId);
- }
-}
Copied: trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutocomplete.java
(from rev 18736,
branches/RF-9096/src/main/java/org/richfaces/component/AbstractAutocomplete.java)
===================================================================
--- trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutocomplete.java
(rev 0)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutocomplete.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -0,0 +1,259 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.component;
+
+import java.io.IOException;
+
+import javax.el.MethodExpression;
+import javax.el.ValueExpression;
+import javax.faces.application.Application;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIInput;
+import javax.faces.component.visit.VisitCallback;
+import javax.faces.component.visit.VisitContext;
+import javax.faces.component.visit.VisitResult;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+
+import org.ajax4jsf.util.ELUtils;
+import org.richfaces.cdk.annotations.Attribute;
+import org.richfaces.cdk.annotations.EventName;
+import org.richfaces.cdk.annotations.JsfComponent;
+import org.richfaces.cdk.annotations.JsfRenderer;
+import org.richfaces.cdk.annotations.Signature;
+import org.richfaces.cdk.annotations.Tag;
+import org.richfaces.cdk.annotations.TagType;
+import org.richfaces.context.ExtendedVisitContext;
+import org.richfaces.context.ExtendedVisitContextMode;
+import org.richfaces.renderkit.MetaComponentRenderer;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+@JsfComponent(tag = @Tag(type = TagType.Facelets, handler =
"org.richfaces.view.facelets.AutocompleteHandler"), renderer = @JsfRenderer(type
= "org.richfaces.AutocompleteRenderer"))
+public abstract class AbstractAutocomplete extends UIInput implements
MetaComponentResolver, MetaComponentEncoder {
+
+ public static final String ITEMS_META_COMPONENT_ID = "items";
+
+ public static final String COMPONENT_TYPE = "org.richfaces.Autocomplete";
+
+ public static final String COMPONENT_FAMILY = UIInput.COMPONENT_FAMILY;
+
+ // TODO nick - change to Object -
https://jira.jboss.org/browse/RF-8897
+ public abstract Object getAutocompleteList();
+
+ @Attribute(signature = @Signature(returnType = Object.class, parameters =
{FacesContext.class, UIComponent.class, String.class}))
+ public abstract MethodExpression getAutocompleteMethod();
+
+ public abstract void setAutocompleteMethod(MethodExpression expression);
+
+ public abstract void setItemConverter(Converter converter);
+
+ @Attribute(literal = true)
+ public abstract String getVar();
+
+ // TODO nick - el-only?
+ @Attribute(literal = false)
+ public abstract Object getFetchValue();
+
+ @Attribute(defaultValue = "1")
+ public abstract int getMinChars();
+
+ @Attribute
+ public abstract String getFilterFunction();
+
+ @Attribute(defaultValue = "rf-au-c")
+ public abstract String getSelectedItemClass();
+
+ @Attribute
+ public abstract String getMode();
+
+ @Attribute
+ public abstract String getLayout();
+
+ @Attribute
+ public abstract Converter getItemConverter();
+
+ @Attribute(defaultValue = "false")
+ public abstract boolean isAutoFill();
+
+ @Attribute(defaultValue = "false")
+ public abstract boolean isDisabled();
+
+ @Attribute(defaultValue = "false")
+ public abstract boolean isShowButton();
+
+ @Attribute(defaultValue = "false")
+ public abstract boolean isSelectFirst();
+
+ @Attribute(events = @EventName("click"))
+ public abstract String getOnclick();
+
+ @Attribute(events = @EventName("dblclick"))
+ public abstract String getOndblclick();
+
+ @Attribute(events = @EventName("mousedown"))
+ public abstract String getOnmousedown();
+
+ @Attribute(events = @EventName("mouseup"))
+ public abstract String getOnmouseup();
+
+ @Attribute(events = @EventName("mouseover"))
+ public abstract String getOnmouseover();
+
+ @Attribute(events = @EventName("mousemove"))
+ public abstract String getOnmousemove();
+
+ @Attribute(events = @EventName("mouseout"))
+ public abstract String getOnmouseout();
+
+ @Attribute(events = @EventName("keypress"))
+ public abstract String getOnkeypress();
+
+ @Attribute(events = @EventName("keydown"))
+ public abstract String getOnkeydown();
+
+ @Attribute(events = @EventName("keyup"))
+ public abstract String getOnkeyup();
+
+ @Attribute(events = @EventName("listclick"))
+ public abstract String getOnlistclick();
+
+ @Attribute(events = @EventName("listdblclick"))
+ public abstract String getOnlistdblclick();
+
+ @Attribute(events = @EventName("listmousedown"))
+ public abstract String getOnlistmousedown();
+
+ @Attribute(events = @EventName("listmouseup"))
+ public abstract String getOnlistmouseup();
+
+ @Attribute(events = @EventName("listmouseover"))
+ public abstract String getOnlistmouseover();
+
+ @Attribute(events = @EventName("listmousemove"))
+ public abstract String getOnlistmousemove();
+
+ @Attribute(events = @EventName("listmouseout"))
+ public abstract String getOnlistmouseout();
+
+ @Attribute(events = @EventName("listkeypress"))
+ public abstract String getOnlistkeypress();
+
+ @Attribute(events = @EventName("listkeydown"))
+ public abstract String getOnlistkeydown();
+
+ @Attribute(events = @EventName("listkeyup"))
+ public abstract String getOnlistkeyup();
+
+ @Attribute(events = @EventName("change"))
+ public abstract String getOnchange();
+
+ @Attribute(events = @EventName("blur"))
+ public abstract String getOnblur();
+
+ @Attribute(events = @EventName("focus"))
+ public abstract String getOnfocus();
+
+ @Attribute(events = @EventName("listblur"))
+ public abstract String getOnlistblur();
+
+ @Attribute(events = @EventName("listfocus"))
+ public abstract String getOnlistfocus();
+
+ @Attribute(events = @EventName("begin"))
+ public abstract String getOnbegin();
+
+ @Attribute(events = @EventName("error"))
+ public abstract String getOnerror();
+
+ @Attribute(events = @EventName("complete"))
+ public abstract String getOncomplete();
+
+ @Attribute(events = @EventName("beforedomupdate"))
+ public abstract String getOnbeforedomupdate();
+
+ @Override
+ public Converter getConverter() {
+ Converter converter = super.getConverter();
+ if (converter == null) {
+ converter = getConverterForValue(FacesContext.getCurrentInstance());
+ }
+
+ return converter;
+ }
+
+ private Converter getConverterForType(FacesContext context, Class<?> type) {
+
+ if (!Object.class.equals(type) && type != null) {
+ Application application = context.getApplication();
+ return application.createConverter(type);
+ }
+
+ return null;
+ }
+
+ public Converter getConverterForValue(FacesContext context) {
+ Converter converter = null;
+ ValueExpression expression = this.getValueExpression("value");
+
+ if (expression != null) {
+ Class<?> containerClass = ELUtils.getContainerClass(context,
expression);
+
+ converter = getConverterForType(context, containerClass);
+ }
+
+ return converter;
+ }
+
+ public String resolveClientId(FacesContext facesContext, UIComponent
contextComponent, String metaComponentId) {
+ if (ITEMS_META_COMPONENT_ID.equals(metaComponentId)) {
+ return getClientId(facesContext) +
MetaComponentResolver.META_COMPONENT_SEPARATOR_CHAR + metaComponentId;
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean visitTree(VisitContext context, VisitCallback callback) {
+ if (context instanceof ExtendedVisitContext) {
+ ExtendedVisitContext extendedVisitContext = (ExtendedVisitContext) context;
+ if (extendedVisitContext.getVisitMode() == ExtendedVisitContextMode.RENDER)
{
+
+ VisitResult result =
extendedVisitContext.invokeMetaComponentVisitCallback(this, callback,
+ ITEMS_META_COMPONENT_ID);
+ if (result == VisitResult.COMPLETE) {
+ return true;
+ } else if (result == VisitResult.REJECT) {
+ return false;
+ }
+ }
+ }
+
+ return super.visitTree(context, callback);
+ }
+
+ public void encodeMetaComponent(FacesContext context, String metaComponentId) throws
IOException {
+ ((MetaComponentRenderer) getRenderer(context)).encodeMetaComponent(context, this,
metaComponentId);
+ }
+}
Deleted:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutoCompleteEncodeStrategy.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutoCompleteEncodeStrategy.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutoCompleteEncodeStrategy.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -1,22 +0,0 @@
-package org.richfaces.renderkit;
-
-import java.io.IOException;
-
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-
-import org.richfaces.component.AbstractAutoComplete;
-
-
-public interface AutoCompleteEncodeStrategy {
- void encodeItemsContainerBegin(FacesContext facesContext, UIComponent component)
throws IOException ;
-
- void encodeItemsContainerEnd(FacesContext facesContext, UIComponent component) throws
IOException ;
-
- void encodeFakeItem(FacesContext facesContext, UIComponent component) throws
IOException ;
-
- void encodeItem(FacesContext facesContext, AbstractAutoComplete comboBox,
- Object nextItem) throws IOException;
-
- public String getContainerElementId(FacesContext facesContext, UIComponent
component);
-}
Deleted:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutoCompleteRendererBase.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutoCompleteRendererBase.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutoCompleteRendererBase.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -1,261 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.renderkit;
-
-import java.io.IOException;
-import java.sql.ResultSet;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.el.ELException;
-import javax.el.MethodExpression;
-import javax.faces.application.ResourceDependencies;
-import javax.faces.application.ResourceDependency;
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-import javax.faces.context.PartialResponseWriter;
-import javax.faces.context.PartialViewContext;
-import javax.faces.model.ArrayDataModel;
-import javax.faces.model.DataModel;
-import javax.faces.model.ListDataModel;
-import javax.faces.model.ResultDataModel;
-import javax.faces.model.ResultSetDataModel;
-import javax.servlet.jsp.jstl.sql.Result;
-
-import org.ajax4jsf.context.AjaxContext;
-import org.ajax4jsf.javascript.ScriptUtils;
-import org.ajax4jsf.renderkit.RendererUtils;
-import org.ajax4jsf.util.InputUtils;
-import org.richfaces.component.AbstractAutoComplete;
-import org.richfaces.component.AutocompleteLayout;
-import org.richfaces.component.MetaComponentResolver;
-
-import com.google.common.base.Predicates;
-import com.google.common.collect.Iterators;
-
-/**
- * @author Nick Belaevski
- *
- */
-@ResourceDependencies({ @ResourceDependency(library = "javax.faces", name =
"jsf.js"),
- @ResourceDependency(name = "jquery.js"), @ResourceDependency(name =
"jquery.position.js"),
- @ResourceDependency(name = "richfaces.js"), @ResourceDependency(name =
"richfaces-event.js"),
- @ResourceDependency(name = "richfaces-base-component.js"),
@ResourceDependency(name = "richfaces-selection.js"),
- @ResourceDependency(library = "org.richfaces", name =
"AutoCompleteBase.js"),
- @ResourceDependency(library = "org.richfaces", name =
"AutoComplete.js"),
- @ResourceDependency(library = "org.richfaces", name =
"AutoComplete.ecss")
-
-})
-public abstract class AutoCompleteRendererBase extends InputRendererBase implements
MetaComponentRenderer {
-
- public String getScriptOptions(UIComponent component) {
- Map<String, Object> attributes = component.getAttributes();
- Map<String, Object> options = new HashMap<String, Object>();
- RendererUtils utils = getUtils();
- utils.addToScriptHash(options, "buttonId", component.getClientId() +
"Button");
- utils.addToScriptHash(options, "selectedItemClass",
attributes.get("selectedItemClass"));
- utils.addToScriptHash(options, "minChars",
attributes.get("minChars"), "1");
- utils.addToScriptHash(options, "mode",
attributes.get("mode"), "ajax");
- utils.addToScriptHash(options, "filterFunction",
attributes.get("filterFunction"));
- utils.addToScriptHash(options, "autoFill",
attributes.get("autoFill"), "false");
- utils.addToScriptHash(options, "disabled",
attributes.get("disabled"), "false");
- utils.addToScriptHash(options, "selectFirst",
attributes.get("selectFirst"), "false");
- utils.addToScriptHash(options, "onbegin",
attributes.get("onbegin"));
- utils.addToScriptHash(options, "oncomplete",
attributes.get("oncomplete"));
- utils.addToScriptHash(options, "onerror",
attributes.get("onerror"));
- utils.addToScriptHash(options, "onbeforedomupdate",
attributes.get("onbeforedomupdate"));
- utils.addToScriptHash(options, "onchange",
attributes.get("onchange"));
- StringBuilder builder = new StringBuilder();
- builder.append(ScriptUtils.toScript(options));
- return builder.toString();
- }
-
- // TODO nick - handle parameter
- @SuppressWarnings("unchecked")
- private DataModel<Object> getItems(FacesContext facesContext,
AbstractAutoComplete component) {
- Object itemsObject = null;
-
- MethodExpression autocompleteMethod = component.getAutocompleteMethod();
- if (autocompleteMethod != null) {
- Map<String, String> requestParameters =
facesContext.getExternalContext().getRequestParameterMap();
- String value = requestParameters.get(component.getClientId(facesContext) +
"Value");
- try {
- // String value = getInputValue(facesContext, component);
-
- itemsObject = autocompleteMethod.invoke(facesContext.getELContext(), new
Object[] { facesContext,
- component, value });
- } catch (ELException e) {
- try {
- autocompleteMethod = facesContext
- .getApplication()
- .getExpressionFactory()
- .createMethodExpression(facesContext.getELContext(),
autocompleteMethod.getExpressionString(),
- Void.class, new Class[] { String.class });
- itemsObject = autocompleteMethod.invoke(facesContext.getELContext(),
new Object[] { value });
- } catch (ELException ee) {
- ee.printStackTrace();
- }
-
- }
- } else {
- itemsObject = component.getAutocompleteList();
- }
-
- DataModel result;
-
- if (itemsObject instanceof Object[]) {
- result = new ArrayDataModel((Object[]) itemsObject);
- } else if (itemsObject instanceof List) {
- result = new ListDataModel((List<Object>) itemsObject);
- } else if (itemsObject instanceof Result) {
- result = new ResultDataModel((Result) itemsObject);
- } else if (itemsObject instanceof ResultSet) {
- result = new ResultSetDataModel((ResultSet) itemsObject);
- } else if (itemsObject != null) {
- List<Object> temp = new ArrayList<Object>();
- Iterator<Object> iterator = ((Iterable<Object>)
itemsObject).iterator();
- while (iterator.hasNext()) {
- temp.add(iterator.next());
- }
- result = new ListDataModel(temp);
- } else {
- result = new ListDataModel(null);
- }
-
- return result;
- }
-
- private Object saveVar(FacesContext context, String var) {
- if (var != null) {
- Map<String, Object> requestMap =
context.getExternalContext().getRequestMap();
- return requestMap.get(var);
- }
-
- return null;
- }
-
- private void setVar(FacesContext context, String var, Object varObject) {
- if (var != null) {
- Map<String, Object> requestMap =
context.getExternalContext().getRequestMap();
- requestMap.put(var, varObject);
- }
- }
-
- protected void encodeItems(FacesContext facesContext, UIComponent component,
List<Object> fetchValues)
- throws IOException {
- AbstractAutoComplete comboBox = (AbstractAutoComplete) component;
- AutoCompleteEncodeStrategy strategy = getStrategy(component);
- strategy.encodeItemsContainerBegin(facesContext, component);
-
- boolean hasEncodedElements = false;
-
- Object savedVar = saveVar(facesContext, comboBox.getVar());
- DataModel<Object> model = getItems(facesContext, comboBox);
- for (Iterator<Object> items = model.iterator(); items.hasNext();) {
- hasEncodedElements = true;
-
- Object nextItem = items.next();
- setVar(facesContext, comboBox.getVar(), nextItem);
-
- strategy.encodeItem(facesContext, comboBox, nextItem);
- if (comboBox.getFetchValue() != null) {
- fetchValues.add(comboBox.getFetchValue());
- } else {
- // TODO use converter
- fetchValues.add(nextItem);
- }
- }
-
- setVar(facesContext, comboBox.getVar(), savedVar);
-
- if (!hasEncodedElements) {
- strategy.encodeFakeItem(facesContext, component);
- }
-
- strategy.encodeItemsContainerEnd(facesContext, component);
- }
-
- protected void encodeItemsContainer(FacesContext facesContext, UIComponent component)
throws IOException {
- AutoCompleteEncodeStrategy strategy = getStrategy(component);
- strategy.encodeItemsContainerBegin(facesContext, component);
- strategy.encodeFakeItem(facesContext, component);
- strategy.encodeItemsContainerEnd(facesContext, component);
- }
-
- private AutoCompleteEncodeStrategy getStrategy(UIComponent component) {
- AbstractAutoComplete comboBox = (AbstractAutoComplete) component;
- if (comboBox.getLayout() != null) {
- if (comboBox.getLayout().equals(AutocompleteLayout.div)) {
- return new AutocompleteDivLayoutStrategy();
- }
- if (comboBox.getLayout().equals(AutocompleteLayout.grid)) {
- return new AutocompleteGridLayoutStrategy();
- }
- if (comboBox.getLayout().equals(AutocompleteLayout.list)) {
- return new AutocompleteListLayoutStrategy();
- }
- if (comboBox.getLayout().equals(AutocompleteLayout.table)) {
- return new AutocompleteTableLayoutStrategy();
- }
- }
- return new AutocompleteDivLayoutStrategy();
- }
-
- @Override
- protected void doDecode(FacesContext context, UIComponent component) {
- if (InputUtils.isDisabled(component)) {
- return;
- }
- super.doDecode(context, component);
-
- Map<String, String> requestParameters =
context.getExternalContext().getRequestParameterMap();
- if (requestParameters.get(component.getClientId(context) + ".ajax") !=
null) {
- PartialViewContext pvc = context.getPartialViewContext();
- pvc.getRenderIds().add(
- component.getClientId(context) +
MetaComponentResolver.META_COMPONENT_SEPARATOR_CHAR
- + AbstractAutoComplete.ITEMS_META_COMPONENT_ID);
- }
- }
-
- public void encodeMetaComponent(FacesContext context, UIComponent component, String
metaComponentId)
- throws IOException {
- if (AbstractAutoComplete.ITEMS_META_COMPONENT_ID.equals(metaComponentId)) {
-
- List<Object> fetchValues = new ArrayList<Object>();
-
- PartialResponseWriter partialWriter =
context.getPartialViewContext().getPartialResponseWriter();
-
partialWriter.startUpdate(getStrategy(component).getContainerElementId(context,
component));
- encodeItems(context, component, fetchValues);
- partialWriter.endUpdate();
-
- if (!fetchValues.isEmpty() && Iterators.find(fetchValues.iterator(),
Predicates.notNull()) != null) {
- Map<String, Object> dataMap =
AjaxContext.getCurrentInstance(context).getResponseComponentDataMap();
- dataMap.put(component.getClientId(context), fetchValues);
- }
- } else {
- throw new IllegalArgumentException(metaComponentId);
- }
- }
-}
Modified:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteDivLayoutStrategy.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteDivLayoutStrategy.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteDivLayoutStrategy.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -29,10 +29,10 @@
import javax.faces.context.ResponseWriter;
import org.ajax4jsf.renderkit.RendererUtils.HTML;
-import org.richfaces.component.AbstractAutoComplete;
+import org.richfaces.component.AbstractAutocomplete;
public class AutocompleteDivLayoutStrategy extends AbstractAutocompleteLayoutStrategy
implements
- AutoCompleteEncodeStrategy {
+ AutocompleteEncodeStrategy {
public void encodeFakeItem(FacesContext facesContext, UIComponent component) throws
IOException {
ResponseWriter responseWriter = facesContext.getResponseWriter();
@@ -54,7 +54,7 @@
responseWriter.endElement(HTML.DIV_ELEM);
}
- public void encodeItem(FacesContext facesContext, AbstractAutoComplete comboBox,
Object item) throws IOException {
+ public void encodeItem(FacesContext facesContext, AbstractAutocomplete comboBox,
Object item) throws IOException {
ResponseWriter writer = facesContext.getResponseWriter();
writer.startElement(HTML.DIV_ELEM, comboBox);
Copied:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteEncodeStrategy.java
(from rev 18736,
branches/RF-9096/src/main/java/org/richfaces/renderkit/AutocompleteEncodeStrategy.java)
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteEncodeStrategy.java
(rev 0)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteEncodeStrategy.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -0,0 +1,22 @@
+package org.richfaces.renderkit;
+
+import java.io.IOException;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+
+import org.richfaces.component.AbstractAutocomplete;
+
+
+public interface AutocompleteEncodeStrategy {
+ void encodeItemsContainerBegin(FacesContext facesContext, UIComponent component)
throws IOException ;
+
+ void encodeItemsContainerEnd(FacesContext facesContext, UIComponent component) throws
IOException ;
+
+ void encodeFakeItem(FacesContext facesContext, UIComponent component) throws
IOException ;
+
+ void encodeItem(FacesContext facesContext, AbstractAutocomplete comboBox,
+ Object nextItem) throws IOException;
+
+ public String getContainerElementId(FacesContext facesContext, UIComponent
component);
+}
Modified:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteGridLayoutStrategy.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteGridLayoutStrategy.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteGridLayoutStrategy.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -5,10 +5,10 @@
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
-import org.richfaces.component.AbstractAutoComplete;
+import org.richfaces.component.AbstractAutocomplete;
public class AutocompleteGridLayoutStrategy extends AbstractAutocompleteLayoutStrategy
implements
- AutoCompleteEncodeStrategy {
+ AutocompleteEncodeStrategy {
public void encodeFakeItem(FacesContext facesContext, UIComponent component) throws
IOException {
// TODO Auto-generated method stub
@@ -25,7 +25,7 @@
}
- public void encodeItem(FacesContext facesContext, AbstractAutoComplete comboBox,
Object nextItem)
+ public void encodeItem(FacesContext facesContext, AbstractAutocomplete comboBox,
Object nextItem)
throws IOException {
// TODO Auto-generated method stub
Modified:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteListLayoutStrategy.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteListLayoutStrategy.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteListLayoutStrategy.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -7,10 +7,10 @@
import javax.faces.context.ResponseWriter;
import org.ajax4jsf.renderkit.RendererUtils.HTML;
-import org.richfaces.component.AbstractAutoComplete;
+import org.richfaces.component.AbstractAutocomplete;
public class AutocompleteListLayoutStrategy extends AbstractAutocompleteLayoutStrategy
implements
- AutoCompleteEncodeStrategy {
+ AutocompleteEncodeStrategy {
public void encodeFakeItem(FacesContext facesContext, UIComponent component) throws
IOException {
ResponseWriter responseWriter = facesContext.getResponseWriter();
@@ -32,7 +32,7 @@
responseWriter.endElement(HTML.UL_ELEMENT);
}
- public void encodeItem(FacesContext facesContext, AbstractAutoComplete comboBox,
Object item) throws IOException {
+ public void encodeItem(FacesContext facesContext, AbstractAutocomplete comboBox,
Object item) throws IOException {
ResponseWriter writer = facesContext.getResponseWriter();
writer.startElement(HTML.LI_ELEMENT, comboBox);
Copied:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java
(from rev 18736,
branches/RF-9096/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java)
===================================================================
--- trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java
(rev 0)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -0,0 +1,261 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.renderkit;
+
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.el.ELException;
+import javax.el.MethodExpression;
+import javax.faces.application.ResourceDependencies;
+import javax.faces.application.ResourceDependency;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.PartialResponseWriter;
+import javax.faces.context.PartialViewContext;
+import javax.faces.model.ArrayDataModel;
+import javax.faces.model.DataModel;
+import javax.faces.model.ListDataModel;
+import javax.faces.model.ResultDataModel;
+import javax.faces.model.ResultSetDataModel;
+import javax.servlet.jsp.jstl.sql.Result;
+
+import org.ajax4jsf.context.AjaxContext;
+import org.ajax4jsf.javascript.ScriptUtils;
+import org.ajax4jsf.renderkit.RendererUtils;
+import org.ajax4jsf.util.InputUtils;
+import org.richfaces.component.AbstractAutocomplete;
+import org.richfaces.component.AutocompleteLayout;
+import org.richfaces.component.MetaComponentResolver;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.Iterators;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+@ResourceDependencies({ @ResourceDependency(library = "javax.faces", name =
"jsf.js"),
+ @ResourceDependency(name = "jquery.js"), @ResourceDependency(name =
"jquery.position.js"),
+ @ResourceDependency(name = "richfaces.js"), @ResourceDependency(name =
"richfaces-event.js"),
+ @ResourceDependency(name = "richfaces-base-component.js"),
@ResourceDependency(name = "richfaces-selection.js"),
+ @ResourceDependency(library = "org.richfaces", name =
"AutocompleteBase.js"),
+ @ResourceDependency(library = "org.richfaces", name =
"Autocomplete.js"),
+ @ResourceDependency(library = "org.richfaces", name =
"Autocomplete.ecss")
+
+})
+public abstract class AutocompleteRendererBase extends InputRendererBase implements
MetaComponentRenderer {
+
+ public String getScriptOptions(UIComponent component) {
+ Map<String, Object> attributes = component.getAttributes();
+ Map<String, Object> options = new HashMap<String, Object>();
+ RendererUtils utils = getUtils();
+ utils.addToScriptHash(options, "buttonId", component.getClientId() +
"Button");
+ utils.addToScriptHash(options, "selectedItemClass",
attributes.get("selectedItemClass"));
+ utils.addToScriptHash(options, "minChars",
attributes.get("minChars"), "1");
+ utils.addToScriptHash(options, "mode",
attributes.get("mode"), "ajax");
+ utils.addToScriptHash(options, "filterFunction",
attributes.get("filterFunction"));
+ utils.addToScriptHash(options, "autoFill",
attributes.get("autoFill"), "false");
+ utils.addToScriptHash(options, "disabled",
attributes.get("disabled"), "false");
+ utils.addToScriptHash(options, "selectFirst",
attributes.get("selectFirst"), "false");
+ utils.addToScriptHash(options, "onbegin",
attributes.get("onbegin"));
+ utils.addToScriptHash(options, "oncomplete",
attributes.get("oncomplete"));
+ utils.addToScriptHash(options, "onerror",
attributes.get("onerror"));
+ utils.addToScriptHash(options, "onbeforedomupdate",
attributes.get("onbeforedomupdate"));
+ utils.addToScriptHash(options, "onchange",
attributes.get("onchange"));
+ StringBuilder builder = new StringBuilder();
+ builder.append(ScriptUtils.toScript(options));
+ return builder.toString();
+ }
+
+ // TODO nick - handle parameter
+ @SuppressWarnings("unchecked")
+ private DataModel<Object> getItems(FacesContext facesContext,
AbstractAutocomplete component) {
+ Object itemsObject = null;
+
+ MethodExpression autocompleteMethod = component.getAutocompleteMethod();
+ if (autocompleteMethod != null) {
+ Map<String, String> requestParameters =
facesContext.getExternalContext().getRequestParameterMap();
+ String value = requestParameters.get(component.getClientId(facesContext) +
"Value");
+ try {
+ // String value = getInputValue(facesContext, component);
+
+ itemsObject = autocompleteMethod.invoke(facesContext.getELContext(), new
Object[] { facesContext,
+ component, value });
+ } catch (ELException e) {
+ try {
+ autocompleteMethod = facesContext
+ .getApplication()
+ .getExpressionFactory()
+ .createMethodExpression(facesContext.getELContext(),
autocompleteMethod.getExpressionString(),
+ Void.class, new Class[] { String.class });
+ itemsObject = autocompleteMethod.invoke(facesContext.getELContext(),
new Object[] { value });
+ } catch (ELException ee) {
+ ee.printStackTrace();
+ }
+
+ }
+ } else {
+ itemsObject = component.getAutocompleteList();
+ }
+
+ DataModel result;
+
+ if (itemsObject instanceof Object[]) {
+ result = new ArrayDataModel((Object[]) itemsObject);
+ } else if (itemsObject instanceof List) {
+ result = new ListDataModel((List<Object>) itemsObject);
+ } else if (itemsObject instanceof Result) {
+ result = new ResultDataModel((Result) itemsObject);
+ } else if (itemsObject instanceof ResultSet) {
+ result = new ResultSetDataModel((ResultSet) itemsObject);
+ } else if (itemsObject != null) {
+ List<Object> temp = new ArrayList<Object>();
+ Iterator<Object> iterator = ((Iterable<Object>)
itemsObject).iterator();
+ while (iterator.hasNext()) {
+ temp.add(iterator.next());
+ }
+ result = new ListDataModel(temp);
+ } else {
+ result = new ListDataModel(null);
+ }
+
+ return result;
+ }
+
+ private Object saveVar(FacesContext context, String var) {
+ if (var != null) {
+ Map<String, Object> requestMap =
context.getExternalContext().getRequestMap();
+ return requestMap.get(var);
+ }
+
+ return null;
+ }
+
+ private void setVar(FacesContext context, String var, Object varObject) {
+ if (var != null) {
+ Map<String, Object> requestMap =
context.getExternalContext().getRequestMap();
+ requestMap.put(var, varObject);
+ }
+ }
+
+ protected void encodeItems(FacesContext facesContext, UIComponent component,
List<Object> fetchValues)
+ throws IOException {
+ AbstractAutocomplete comboBox = (AbstractAutocomplete) component;
+ AutocompleteEncodeStrategy strategy = getStrategy(component);
+ strategy.encodeItemsContainerBegin(facesContext, component);
+
+ boolean hasEncodedElements = false;
+
+ Object savedVar = saveVar(facesContext, comboBox.getVar());
+ DataModel<Object> model = getItems(facesContext, comboBox);
+ for (Iterator<Object> items = model.iterator(); items.hasNext();) {
+ hasEncodedElements = true;
+
+ Object nextItem = items.next();
+ setVar(facesContext, comboBox.getVar(), nextItem);
+
+ strategy.encodeItem(facesContext, comboBox, nextItem);
+ if (comboBox.getFetchValue() != null) {
+ fetchValues.add(comboBox.getFetchValue());
+ } else {
+ // TODO use converter
+ fetchValues.add(nextItem);
+ }
+ }
+
+ setVar(facesContext, comboBox.getVar(), savedVar);
+
+ if (!hasEncodedElements) {
+ strategy.encodeFakeItem(facesContext, component);
+ }
+
+ strategy.encodeItemsContainerEnd(facesContext, component);
+ }
+
+ protected void encodeItemsContainer(FacesContext facesContext, UIComponent component)
throws IOException {
+ AutocompleteEncodeStrategy strategy = getStrategy(component);
+ strategy.encodeItemsContainerBegin(facesContext, component);
+ strategy.encodeFakeItem(facesContext, component);
+ strategy.encodeItemsContainerEnd(facesContext, component);
+ }
+
+ private AutocompleteEncodeStrategy getStrategy(UIComponent component) {
+ AbstractAutocomplete comboBox = (AbstractAutocomplete) component;
+ if (comboBox.getLayout() != null) {
+ if (comboBox.getLayout().equals(AutocompleteLayout.div)) {
+ return new AutocompleteDivLayoutStrategy();
+ }
+ if (comboBox.getLayout().equals(AutocompleteLayout.grid)) {
+ return new AutocompleteGridLayoutStrategy();
+ }
+ if (comboBox.getLayout().equals(AutocompleteLayout.list)) {
+ return new AutocompleteListLayoutStrategy();
+ }
+ if (comboBox.getLayout().equals(AutocompleteLayout.table)) {
+ return new AutocompleteTableLayoutStrategy();
+ }
+ }
+ return new AutocompleteDivLayoutStrategy();
+ }
+
+ @Override
+ protected void doDecode(FacesContext context, UIComponent component) {
+ if (InputUtils.isDisabled(component)) {
+ return;
+ }
+ super.doDecode(context, component);
+
+ Map<String, String> requestParameters =
context.getExternalContext().getRequestParameterMap();
+ if (requestParameters.get(component.getClientId(context) + ".ajax") !=
null) {
+ PartialViewContext pvc = context.getPartialViewContext();
+ pvc.getRenderIds().add(
+ component.getClientId(context) +
MetaComponentResolver.META_COMPONENT_SEPARATOR_CHAR
+ + AbstractAutocomplete.ITEMS_META_COMPONENT_ID);
+ }
+ }
+
+ public void encodeMetaComponent(FacesContext context, UIComponent component, String
metaComponentId)
+ throws IOException {
+ if (AbstractAutocomplete.ITEMS_META_COMPONENT_ID.equals(metaComponentId)) {
+
+ List<Object> fetchValues = new ArrayList<Object>();
+
+ PartialResponseWriter partialWriter =
context.getPartialViewContext().getPartialResponseWriter();
+
partialWriter.startUpdate(getStrategy(component).getContainerElementId(context,
component));
+ encodeItems(context, component, fetchValues);
+ partialWriter.endUpdate();
+
+ if (!fetchValues.isEmpty() && Iterators.find(fetchValues.iterator(),
Predicates.notNull()) != null) {
+ Map<String, Object> dataMap =
AjaxContext.getCurrentInstance(context).getResponseComponentDataMap();
+ dataMap.put(component.getClientId(context), fetchValues);
+ }
+ } else {
+ throw new IllegalArgumentException(metaComponentId);
+ }
+ }
+}
Modified:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteTableLayoutStrategy.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteTableLayoutStrategy.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteTableLayoutStrategy.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -5,10 +5,10 @@
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
-import org.richfaces.component.AbstractAutoComplete;
+import org.richfaces.component.AbstractAutocomplete;
public class AutocompleteTableLayoutStrategy extends AbstractAutocompleteLayoutStrategy
implements
- AutoCompleteEncodeStrategy {
+ AutocompleteEncodeStrategy {
public void encodeFakeItem(FacesContext facesContext, UIComponent component) throws
IOException {
// TODO Auto-generated method stub
@@ -25,7 +25,7 @@
}
- public void encodeItem(FacesContext facesContext, AbstractAutoComplete comboBox,
Object nextItem)
+ public void encodeItem(FacesContext facesContext, AbstractAutocomplete comboBox,
Object nextItem)
throws IOException {
// TODO Auto-generated method stub
Deleted:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteBaseGradient.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteBaseGradient.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteBaseGradient.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -1,126 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.renderkit.html.images;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.GradientPaint;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.Date;
-import java.util.Map;
-
-import javax.faces.context.FacesContext;
-
-import org.richfaces.resource.CacheableResource;
-import org.richfaces.resource.DynamicResource;
-import org.richfaces.resource.ImageType;
-import org.richfaces.resource.Java2DUserResource;
-import org.richfaces.resource.StateHolderResource;
-import org.richfaces.skin.Skin;
-import org.richfaces.skin.SkinFactory;
-
-/**
- * @author Nick Belaevski
- *
- */
-@DynamicResource
-public abstract class AutoCompleteBaseGradient implements Java2DUserResource,
CacheableResource, StateHolderResource {
-
- private static final Dimension DIMENSION = new Dimension(18, 8);
-
- private String topColorSkinParameter;
-
- private String bottomColorSkinParameter;
-
- private Color topColor;
-
- private Color bottomColor;
-
- public Map<String, String> getResponseHeaders() {
- return null;
- }
-
- public Date getLastModified() {
- return null;
- }
-
- public ImageType getImageType() {
- return ImageType.PNG;
- }
-
- public Dimension getDimension() {
- return DIMENSION;
- }
-
- public void paint(Graphics2D graphics2d, Dimension dimension) {
- GradientPaint paint = new GradientPaint(0, 0, topColor, 0, dimension.height,
bottomColor);
- graphics2d.setPaint(paint);
- graphics2d.fill(new Rectangle(dimension));
- }
-
- public boolean isCacheable(FacesContext context) {
- return true;
- }
-
- public Date getExpires(FacesContext context) {
- return null;
- }
-
- public int getTimeToLive(FacesContext context) {
- return 0;
- }
-
- public String getEntityTag(FacesContext context) {
- return null;
- }
-
- public void writeState(FacesContext context, DataOutput dataOutput) throws
IOException {
- Skin skin = SkinFactory.getInstance().getSkin(context);
-
- Integer topColor = skin.getColorParameter(context, topColorSkinParameter);
- Integer bottomColor = skin.getColorParameter(context, bottomColorSkinParameter);
-
- dataOutput.writeInt(topColor);
- dataOutput.writeInt(bottomColor);
- }
-
- public void readState(FacesContext context, DataInput dataInput) throws IOException
{
- topColor = new Color(dataInput.readInt());
- bottomColor = new Color(dataInput.readInt());
- }
-
- public boolean isTransient() {
- return false;
- }
-
- protected void setTopColorSkinParameter(String topColorSkinParameter) {
- this.topColorSkinParameter = topColorSkinParameter;
- }
-
- protected void setBottomColorSkinParameter(String bottomColorSkinParameter) {
- this.bottomColorSkinParameter = bottomColorSkinParameter;
- }
-}
Deleted:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteButtonGradient.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteButtonGradient.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteButtonGradient.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -1,39 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.renderkit.html.images;
-
-import org.richfaces.resource.DynamicResource;
-import org.richfaces.skin.Skin;
-
-/**
- * @author Nick Belaevski
- *
- */
-@DynamicResource
-public class AutoCompleteButtonGradient extends AutoCompleteBaseGradient {
-
- public AutoCompleteButtonGradient() {
- setTopColorSkinParameter(Skin.HEADER_GRADIENT_COLOR);
- setBottomColorSkinParameter(Skin.HEADER_BACKGROUND_COLOR);
- }
-
-}
Deleted:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteFieldGradient.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteFieldGradient.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutoCompleteFieldGradient.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -1,38 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.renderkit.html.images;
-
-import org.richfaces.resource.DynamicResource;
-import org.richfaces.skin.Skin;
-
-/**
- * @author Nick Belaevski
- *
- */
-@DynamicResource
-public class AutoCompleteFieldGradient extends AutoCompleteBaseGradient {
-
- public AutoCompleteFieldGradient() {
- setTopColorSkinParameter(Skin.ADDITIONAL_BACKGROUND_COLOR);
- setBottomColorSkinParameter(Skin.CONTROL_BACKGROUND_COLOR);
- }
-}
Copied:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteBaseGradient.java
(from rev 18736,
branches/RF-9096/src/main/java/org/richfaces/renderkit/html/images/AutocompleteBaseGradient.java)
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteBaseGradient.java
(rev 0)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteBaseGradient.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -0,0 +1,126 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.renderkit.html.images;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.GradientPaint;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Map;
+
+import javax.faces.context.FacesContext;
+
+import org.richfaces.resource.CacheableResource;
+import org.richfaces.resource.DynamicResource;
+import org.richfaces.resource.ImageType;
+import org.richfaces.resource.Java2DUserResource;
+import org.richfaces.resource.StateHolderResource;
+import org.richfaces.skin.Skin;
+import org.richfaces.skin.SkinFactory;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+@DynamicResource
+public abstract class AutocompleteBaseGradient implements Java2DUserResource,
CacheableResource, StateHolderResource {
+
+ private static final Dimension DIMENSION = new Dimension(18, 8);
+
+ private String topColorSkinParameter;
+
+ private String bottomColorSkinParameter;
+
+ private Color topColor;
+
+ private Color bottomColor;
+
+ public Map<String, String> getResponseHeaders() {
+ return null;
+ }
+
+ public Date getLastModified() {
+ return null;
+ }
+
+ public ImageType getImageType() {
+ return ImageType.PNG;
+ }
+
+ public Dimension getDimension() {
+ return DIMENSION;
+ }
+
+ public void paint(Graphics2D graphics2d, Dimension dimension) {
+ GradientPaint paint = new GradientPaint(0, 0, topColor, 0, dimension.height,
bottomColor);
+ graphics2d.setPaint(paint);
+ graphics2d.fill(new Rectangle(dimension));
+ }
+
+ public boolean isCacheable(FacesContext context) {
+ return true;
+ }
+
+ public Date getExpires(FacesContext context) {
+ return null;
+ }
+
+ public int getTimeToLive(FacesContext context) {
+ return 0;
+ }
+
+ public String getEntityTag(FacesContext context) {
+ return null;
+ }
+
+ public void writeState(FacesContext context, DataOutput dataOutput) throws
IOException {
+ Skin skin = SkinFactory.getInstance().getSkin(context);
+
+ Integer topColor = skin.getColorParameter(context, topColorSkinParameter);
+ Integer bottomColor = skin.getColorParameter(context, bottomColorSkinParameter);
+
+ dataOutput.writeInt(topColor);
+ dataOutput.writeInt(bottomColor);
+ }
+
+ public void readState(FacesContext context, DataInput dataInput) throws IOException
{
+ topColor = new Color(dataInput.readInt());
+ bottomColor = new Color(dataInput.readInt());
+ }
+
+ public boolean isTransient() {
+ return false;
+ }
+
+ protected void setTopColorSkinParameter(String topColorSkinParameter) {
+ this.topColorSkinParameter = topColorSkinParameter;
+ }
+
+ protected void setBottomColorSkinParameter(String bottomColorSkinParameter) {
+ this.bottomColorSkinParameter = bottomColorSkinParameter;
+ }
+}
Copied:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteButtonGradient.java
(from rev 18736,
branches/RF-9096/src/main/java/org/richfaces/renderkit/html/images/AutocompleteButtonGradient.java)
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteButtonGradient.java
(rev 0)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteButtonGradient.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.renderkit.html.images;
+
+import org.richfaces.resource.DynamicResource;
+import org.richfaces.skin.Skin;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+@DynamicResource
+public class AutocompleteButtonGradient extends AutocompleteBaseGradient {
+
+ public AutocompleteButtonGradient() {
+ setTopColorSkinParameter(Skin.HEADER_GRADIENT_COLOR);
+ setBottomColorSkinParameter(Skin.HEADER_BACKGROUND_COLOR);
+ }
+
+}
Copied:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteFieldGradient.java
(from rev 18736,
branches/RF-9096/src/main/java/org/richfaces/renderkit/html/images/AutocompleteFieldGradient.java)
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteFieldGradient.java
(rev 0)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/html/images/AutocompleteFieldGradient.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.renderkit.html.images;
+
+import org.richfaces.resource.DynamicResource;
+import org.richfaces.skin.Skin;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+@DynamicResource
+public class AutocompleteFieldGradient extends AutocompleteBaseGradient {
+
+ public AutocompleteFieldGradient() {
+ setTopColorSkinParameter(Skin.ADDITIONAL_BACKGROUND_COLOR);
+ setBottomColorSkinParameter(Skin.CONTROL_BACKGROUND_COLOR);
+ }
+}
Deleted:
trunk/ui/input/ui/src/main/java/org/richfaces/view/facelets/AutoCompleteHandler.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/view/facelets/AutoCompleteHandler.java 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/view/facelets/AutoCompleteHandler.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -1,97 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.view.facelets;
-
-import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
-import javax.faces.view.facelets.ComponentConfig;
-import javax.faces.view.facelets.ComponentHandler;
-import javax.faces.view.facelets.FaceletContext;
-import javax.faces.view.facelets.MetaRule;
-import javax.faces.view.facelets.MetaRuleset;
-import javax.faces.view.facelets.Metadata;
-import javax.faces.view.facelets.MetadataTarget;
-import javax.faces.view.facelets.TagAttribute;
-
-import org.richfaces.MethodMetadata;
-import org.richfaces.component.AbstractAutoComplete;
-
-/**
- * @author Nick Belaevski
- *
- */
-// TODO nick - this should be generated by CDK
-public class AutoCompleteHandler extends ComponentHandler {
-
- private static final MetaRule AUTOCOMPLETE_METHOD_META_RULE = new MetaRule() {
-
- @Override
- public Metadata applyRule(String name, TagAttribute attribute, MetadataTarget
meta) {
- if (meta.isTargetInstanceOf(AbstractAutoComplete.class)) {
- if ("autocompleteMethod".equals(name)) {
- return new MethodMetadata(attribute, FacesContext.class,
UIComponent.class, String.class) {
- public void applyMetadata(FaceletContext ctx, Object instance) {
- ((AbstractAutoComplete)
instance).setAutocompleteMethod(getMethodExpression(ctx));
- }
- };
- }
- /*
- * if ("converter".equals(name)) { return new
ConverterMetadata(attribute) { public void
- * applyMetadata(FaceletContext ctx, Object instance) {
((AbstractComboBox)
- * instance).setConverter((Converter) this.getAttr() .getObject(ctx,
Converter.class)); } }; }
- */
- /*
- * if ("itemConverter".equals(name)) { return new
ConverterMetadata(attribute) { public void
- * applyMetadata(FaceletContext ctx, Object instance) {
((AbstractComboBox)
- * instance).setItemConverter((Converter) this.getAttr() .getObject(ctx,
Converter.class)); } }; }
- */
- }
-
- return null;
- }
- };
-
- public AutoCompleteHandler(ComponentConfig config) {
- super(config);
- }
-
- @Override
- protected MetaRuleset createMetaRuleset(Class type) {
- MetaRuleset metaRuleset = super.createMetaRuleset(type);
- metaRuleset.addRule(AUTOCOMPLETE_METHOD_META_RULE);
- return metaRuleset;
- }
-
- abstract static class ConverterMetadata extends Metadata {
-
- private final TagAttribute attr;
-
- public ConverterMetadata(TagAttribute attr) {
- this.attr = attr;
- }
-
- public TagAttribute getAttr() {
- return attr;
- }
-
- }
-}
Copied:
trunk/ui/input/ui/src/main/java/org/richfaces/view/facelets/AutocompleteHandler.java (from
rev 18736,
branches/RF-9096/src/main/java/org/richfaces/view/facelets/AutocompleteHandler.java)
===================================================================
--- trunk/ui/input/ui/src/main/java/org/richfaces/view/facelets/AutocompleteHandler.java
(rev 0)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/view/facelets/AutocompleteHandler.java 2010-08-17
19:30:38 UTC (rev 18737)
@@ -0,0 +1,97 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.view.facelets;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.view.facelets.ComponentConfig;
+import javax.faces.view.facelets.ComponentHandler;
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.MetaRule;
+import javax.faces.view.facelets.MetaRuleset;
+import javax.faces.view.facelets.Metadata;
+import javax.faces.view.facelets.MetadataTarget;
+import javax.faces.view.facelets.TagAttribute;
+
+import org.richfaces.MethodMetadata;
+import org.richfaces.component.AbstractAutocomplete;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+// TODO nick - this should be generated by CDK
+public class AutocompleteHandler extends ComponentHandler {
+
+ private static final MetaRule AUTOCOMPLETE_METHOD_META_RULE = new MetaRule() {
+
+ @Override
+ public Metadata applyRule(String name, TagAttribute attribute, MetadataTarget
meta) {
+ if (meta.isTargetInstanceOf(AbstractAutocomplete.class)) {
+ if ("autocompleteMethod".equals(name)) {
+ return new MethodMetadata(attribute, FacesContext.class,
UIComponent.class, String.class) {
+ public void applyMetadata(FaceletContext ctx, Object instance) {
+ ((AbstractAutocomplete)
instance).setAutocompleteMethod(getMethodExpression(ctx));
+ }
+ };
+ }
+ /*
+ * if ("converter".equals(name)) { return new
ConverterMetadata(attribute) { public void
+ * applyMetadata(FaceletContext ctx, Object instance) {
((AbstractComboBox)
+ * instance).setConverter((Converter) this.getAttr() .getObject(ctx,
Converter.class)); } }; }
+ */
+ /*
+ * if ("itemConverter".equals(name)) { return new
ConverterMetadata(attribute) { public void
+ * applyMetadata(FaceletContext ctx, Object instance) {
((AbstractComboBox)
+ * instance).setItemConverter((Converter) this.getAttr() .getObject(ctx,
Converter.class)); } }; }
+ */
+ }
+
+ return null;
+ }
+ };
+
+ public AutocompleteHandler(ComponentConfig config) {
+ super(config);
+ }
+
+ @Override
+ protected MetaRuleset createMetaRuleset(Class type) {
+ MetaRuleset metaRuleset = super.createMetaRuleset(type);
+ metaRuleset.addRule(AUTOCOMPLETE_METHOD_META_RULE);
+ return metaRuleset;
+ }
+
+ abstract static class ConverterMetadata extends Metadata {
+
+ private final TagAttribute attr;
+
+ public ConverterMetadata(TagAttribute attr) {
+ this.attr = attr;
+ }
+
+ public TagAttribute getAttr() {
+ return attr;
+ }
+
+ }
+}
Deleted:
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoComplete.ecss
===================================================================
---
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoComplete.ecss 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoComplete.ecss 2010-08-17
19:30:38 UTC (rev 18737)
@@ -1,152 +0,0 @@
-.rf-au-f-w{
- width: 200px;
-}
-
-.rf-au-l-w{
- width: 200px;
-}
-
-.rf-au-l-h{
- max-height: 100px;
- min-height: 20px;
-}
-
-.rf-au-i.rf-au-ft, .rf-au-o.rf-au-ft{
- color: '#{richSkin.generalTextColor}';
- font-size: '#{richSkin.generalSizeFont}';
- font-family: '#{richSkin.generalFamilyFont}';
-}
-
-input.rf-au-i {
- border-width: 0px;
- background: none;
- width: 100%;
-}
-
-.rf-au-f{
- position: inline-block;
- border-width: 1px;
- border-style: solid;
- border-color: '#{richSkin.panelBorderColor}';
- display: inline-block;
- background-image:
"url(#{resource['org.richfaces.renderkit.html.images.AutoCompleteFieldGradient']})";
- background-repeat: repeat-x;
- background-position: top left;
- background-color: '#{richSkin.controlBackgroundColor}';
-}
-
-.rf-au-b{
- background-image:
"url(#{resource['org.richfaces.renderkit.html.images.AutoCompleteButtonGradient']})";
- background-repeat: repeat-x;
- background-position: top left;
- background-color: '#{richSkin.headerBackgroundColor}';
- text-align: center;
- border-left-style: solid;
- border-left-width: 1px;
- border-left-color: '#{richSkin.panelBorderColor}';
- width: 15px;
- position: absolute;
- top: 0px;
- right: 0px;
- height: 200px;
- padding-top: 1px
-}
-
-.rf-au-b-a{
- background-position: center;
- background-repeat: no-repeat;
- background-image:
"url(#{resource['org.richfaces:combo_down_button.gif']})";
- cursor: pointer;
- width: 15px;
- height: 15px;
-}
-
-.rf-au-l-c{
- position: absolute;
- /* TODO nick - review: font-size: 0px; */
- display: none;
-}
-
-.rf-au-l-d{
- border-width: 1px;
- border-style: solid;
- border-color: '#{richSkin.panelBorderColor}';
- padding: 0px;
- background-color: '#{richSkin.tableBackgroundColor}';
-}
-
-.rf-au-l-s{
- overflow: auto;
- overflow-x: hidden;
-}
-
-.rf-au-o{
- padding: 2px;
- white-space: nowrap;
- cursor: default;
- list-style-type: none;
-}
-
-.rf-au-s{
- padding: 1px;
- width: 100%;
- background-color: '#{richSkin.headerBackgroundColor}';
- border-width: 1px;
- border-style: dotted;
- border-color: '#{richSkin.generalTextColor}';
-}
-
-.rf-au-shw{
- border: 0px solid red;
- display: inline-block;
- position: absolute;
- float: left;
- padding: 6px 6px 6px 6px;
- top: -6px;
- left: -7px;
-}
-
-.rf-au-shw-t{
- background-image:
"url(#{resource['org.richfaces:combo_list_shadow.png']})";
- background-position: top left;
- position: absolute;
- width: 6px;
- top: 0px;
- bottom: 6px;
- left: 0px
-}
-
-.rf-au-shw-l{
- background-image:
"url(#{resource['org.richfaces:combo_list_shadow.png']})";
- background-position: bottom left;
- position: absolute;
- height: 6px;
- bottom: 0px;
- left: 0px;
- right: 6px;
-}
-
-.rf-au-shw-r{
- background-image:
"url(#{resource['org.richfaces:combo_list_shadow.png']})";
- background-position: bottom right;
- position: absolute;
- width: 6px;
- top: 6px;
- bottom: 0px;
- right: 0px;
-}
-
-.rf-au-shw-b{
- background-image:
"url(#{resource['org.richfaces:combo_list_shadow.png']})";
- background-position: right top;
- position: absolute;
- height: 6px;
- top: 0px;
- left: 6px;
- right: 0px;
-}
-
-.rf-au-l-ul{
- margin: 0px;
- padding: 0px;
-}
\ No newline at end of file
Deleted:
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoComplete.js
===================================================================
---
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoComplete.js 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoComplete.js 2010-08-17
19:30:38 UTC (rev 18737)
@@ -1,408 +0,0 @@
-(function ($, rf) {
- rf.utils = rf.utils || {};
-
- rf.utils.Cache = function (key, items, values) {
- this.key = key;
- this.cache = {}
- this.cache[this.key] = items || [];
- this.values = typeof values != "function" ? values || this.cache[this.key] :
values(items);
- };
-
- var getItems = function (key) {
- var newCache = [];
-
- if (key.length < this.key.length) {
- return newCache;
- }
-
- if (this.cache[key]) {
- newCache = this.cache[key];
- } else {
- var itemsCache = this.cache[this.key];
- for (var i = 0; i<this.values.length; i++) {
- var value = this.values[i].toLowerCase();
- var p = value.indexOf(key.toLowerCase());
- if (p == 0) {
- newCache.push(itemsCache[i]);
- }
- }
-
- if ((!this.lastKey || key.indexOf(this.lastKey)!=0) && newCache.length > 0)
{
- this.cache[key] = newCache;
- if (newCache.length==1) {
- this.lastKey = key;
- }
- }
- }
-
- return newCache;
- };
-
- var getItemValue = function (item) {
- return this.values[this.cache[this.key].index(item)];
- };
-
- var isCached = function (key) {
- return this.cache[key];
- };
-
- $.extend(rf.utils.Cache.prototype, (function () {
- return {
- getItems: getItems,
- getItemValue: getItemValue,
- isCached: isCached
- };
- })());
-
-})(jQuery, RichFaces);
-
-(function ($, rf) {
-
- /*
- * TODO: add user's event handlers call from options
- * TODO: add fire events
- */
-
- rf.ui = rf.ui || {};
- // Constructor definition
- rf.ui.AutoComplete = function(componentId, fieldId, options) {
- this.namespace = "."+rf.Event.createNamespace(this.name, this.id);
- this.options = {};
- // call constructor of parent class
- $super.constructor.call(this, componentId, componentId+ID.SELECT, fieldId, options);
- this.attachToDom(componentId);
- this.options = $.extend(this.options, defaultOptions, options);
- this.value = this.__getSubValue();
- this.index = -1;
- this.isFirstAjax = true;
- updateTokenOptions.call(this);
- bindEventHandlers.call(this);
- updateItemsList.call(this, "");
- };
-
- // Extend component class and add protected methods from parent class to our container
- rf.ui.AutoCompleteBase.extend(rf.ui.AutoComplete);
-
- // define super class link
- var $super = rf.ui.AutoComplete.$super;
-
- var defaultOptions = {
- selectedItemClass:'rf-au-s',
- autoFill:true,
- minChars:1,
- selectFirst:true,
- ajaxMode:true,
- tokens: ",",
- attachToBody:true
- };
-
- var ID = {
- SELECT:'List',
- ITEMS:'Items',
- VALUE:'Value'
- };
-
- var REGEXP_TRIM = /^[\n\s]*(.*)[\n\s]*$/;
- var REGEXP_TOKEN_LEFT;
- var REGEXP_TOKEN_RIGHT;
-
- var getData = function (nodeList) {
- var data = [];
- nodeList.each(function () {;
- data.push($(this).text().replace(REGEXP_TRIM, "$1"));
- });
- return data;
- }
-
- var updateTokenOptions = function () {
- this.useTokens = (typeof this.options.tokens == "string" &&
this.options.tokens.length>0);
- if (this.useTokens) {
- var escapedTokens = this.options.tokens.split('').join("\\");
- REGEXP_TOKEN_LEFT = new RegExp('[^'+escapedTokens+']+$','i');
- REGEXP_TOKEN_RIGHT = new RegExp('['+escapedTokens+']','i');
- this.hasSpaceToken = this.options.tokens.indexOf(' ')!=-1;
- };
- };
-
- var bindEventHandlers = function () {
- rf.Event.bind(rf.getDomElement(this.id+ID.ITEMS).parentNode,
"click"+this.namespace+" mouseover"+this.namespace, onMouseAction,
this);
- };
-
- var onMouseAction = function(event) {
- var element = $(event.target).closest(".rf-ac-i",
event.currentTarget).get(0);
-
- if (element) {
- if (event.type=="mouseover") {
- var index = this.items.index(element);
- if (index!=this.index) {
- selectItem.call(this, index);
- }
- } else {
- this.__onChangeValue(event, getSelectedItemValue.call(this));
- rf.Selection.setCaretTo(rf.getDomElement(this.fieldId));
- this.hide(event);
- }
- }
- };
-
- var updateItemsList = function (value, fetchValues) {
- this.items = $(rf.getDomElement(this.id+ID.ITEMS)).find(".rf-ac-i");
- if (this.items.length>0) {
- this.cache = new rf.utils.Cache(value, this.items, fetchValues || getData);
- }
- };
-
- var scrollToSelectedItem = function() {
- var offset = 0;
- this.items.slice(0, this.index).each(function() {
- offset += this.offsetHeight;
- });
- var parentContainer = $(rf.getDomElement(this.id+ID.ITEMS)).parent();
- if(offset < parentContainer.scrollTop()) {
- parentContainer.scrollTop(offset);
- } else {
- offset+=this.items.get(this.index).offsetHeight;
- if(offset - parentContainer.scrollTop() >
parentContainer.get(0).clientHeight) {
- parentContainer.scrollTop(offset - parentContainer.innerHeight());
- }
- }
- };
-
- var autoFill = function (inputValue, value) {
- if( this.options.autoFill) {
- var field = rf.getDomElement(this.fieldId);
- var start = rf.Selection.getStart(field);
- this.setInputValue(inputValue + value.substring(inputValue.length));
- var end = start+value.length - inputValue.length;
- rf.Selection.set(field, start, end);
- }
- };
-
- var callAjax = function(event, value) {
-
- $(rf.getDomElement(this.id+ID.ITEMS)).removeData().empty();
- rf.getDomElement(this.id+ID.VALUE).value = value;
-
- var _this = this;
- var ajaxSuccess = function (event) {
- updateItemsList.call(_this, _this.value, event.componentData &&
event.componentData[_this.id]);
- if (_this.isVisible && _this.options.selectFirst) {
- selectItem.call(_this, 0);
- }
- }
-
- var ajaxError = function (event) {
- //alert("error");
- }
-
- this.isFirstAjax = false;
- //caution: JSF submits inputs with empty names causing "WARNING: Parameters:
Invalid chunk ignored." in Tomcat log
- var params = {};
- params[this.id + ".ajax"] = "1";
- rf.ajax(this.id, event, {parameters: params, error: ajaxError, complete:ajaxSuccess});
- };
-
- var selectItem = function(index, isOffset, noAutoFill) {
- if (this.items.length==0) return;
-
- if (this.index!=-1) {
- this.items.eq(this.index).removeClass(this.options.selectedItemClass);
- }
-
- if (index==undefined) {
- this.index = -1;
- return;
- }
-
- if (isOffset) {
- this.index += index;
- if ( this.index<0 ) {
- this.index = this.items.length - 1;
- } else if (this.index >= this.items.length) {
- this.index = 0;
- }
- } else {
- if (index<0) {
- index = 0;
- } else if (index>=this.items.length) {
- index = this.items.length - 1;
- }
- this.index = index;
- }
- var item = this.items.eq(this.index);
- item.addClass(this.options.selectedItemClass);
- scrollToSelectedItem.call(this);
- !noAutoFill && autoFill.call(this, this.value,
getSelectedItemValue.call(this));
- };
-
- var onChangeValue = function (event, value) {
- //if(this.options.onchange){
- //this.options.onchange.call(this, event);
- //}
- selectItem.call(this);
-
- // value is undefined if called from AutoCompleteBase onChange
- var subValue = (typeof value == "undefined") ? this.__getSubValue() : value;
-
- // TODO: ajax call here if needed
- if ((!this.cache || subValue.length==0 ||
subValue.toLowerCase().indexOf(this.cache.key.toLowerCase())!=0) &&
- subValue.length>=this.options.minChars) {
- this.value = subValue;
- this.options.ajaxMode && callAjax.call(this, event, subValue);
- return;
- }
- if(!this.cache){
- return;
- }
- var newItems = this.cache.getItems(subValue);
- this.items = $(newItems);
- //TODO: works only with simple markup, not with <tr>
- $(rf.getDomElement(this.id+ID.ITEMS)).empty().append(newItems);
- this.index = -1;
- this.value = subValue;
- if (subValue.length<this.options.minChars){
- this.hide();
- }
- if (this.options.selectFirst) {
- if (event.which == rf.KEYS.RETURN || event.type == "click") {
- this.setInputValue(subValue);
- return;
- } else {
- selectItem.call(this, 0, false, event.which == rf.KEYS.BACKSPACE || event.which ==
rf.KEYS.LEFT || event.which == rf.KEYS.RIGHT);
- return;
- }
- }
- this.setInputValue(subValue);
- };
-
- var getSelectedItemValue = function () {
- if ( this.index>=0) {
- var element = this.items.eq(this.index);
- return this.cache.getItemValue(element);
- }
- return undefined;
- };
-
- var getSubValue = function () {
- //TODO: add posibility to use space chars before and after tokens if space not a token
char
- if (this.useTokens) {
- var field = rf.getDomElement(this.fieldId);
- var value = field.value;
- var cursorPosition = rf.Selection.getStart(field);
- var beforeCursorStr = value.substring(0, cursorPosition);
- var afterCursorStr = value.substring(cursorPosition);
- var r = REGEXP_TOKEN_LEFT.exec(beforeCursorStr);
- var result = "";
- if (r) {
- result = r[0];
- }
- r = afterCursorStr.search(REGEXP_TOKEN_RIGHT);
- if (r==-1) r = afterCursorStr.length;
- result += afterCursorStr.substring(0, r);
-
- return result;
- } else {
- return this.getInputValue();
- }
- };
-
- var updateInputValue = function (value) {
- var field = rf.getDomElement(this.fieldId);
- var inputValue = field.value;
-
- var cursorPosition = rf.Selection.getStart(field);
- var beforeCursorStr = inputValue.substring(0, cursorPosition);
- var afterCursorStr = inputValue.substring(cursorPosition);
-
- var pos = beforeCursorStr.search(REGEXP_TOKEN_LEFT);
- var startPos = pos!=-1 ? pos : beforeCursorStr.length;
- pos = afterCursorStr.search(REGEXP_TOKEN_RIGHT);
- var endPos = pos!=-1 ? pos : afterCursorStr.length;
-
- var beginNewValue = inputValue.substring(0, startPos) + value;
- cursorPosition = beginNewValue.length;
- field.value = beginNewValue + afterCursorStr.substring(endPos);
- field.focus();
- rf.Selection.setCaretTo(field, cursorPosition);
- return field.value;
- };
-
- /*
- * Prototype definition
- */
- $.extend(rf.ui.AutoComplete.prototype, (function () {
- return {
- /*
- * public API functions
- */
- name:"AutoComplete",
- /*
- * Protected methods
- */
- __updateState: function (event) {
- var subValue = this.__getSubValue();
- // called from onShow method, not actually value changed
- if (this.items.length==0 && this.isFirstAjax) {
- this.options.ajaxMode && callAjax.call(this, event, subValue);
- }
- return;
- },
- __getSubValue: getSubValue,
- __updateInputValue: function (value) {
- if (this.useTokens) {
- return updateInputValue.call(this, value);
- } else {
- return $super.__updateInputValue.call(this, value);
- }
- },
- __onChangeValue: onChangeValue,
- /*
- * Override abstract protected methods
- */
- __onKeyUp: function () {
- selectItem.call(this, -1, true);
- },
- __onKeyDown: function () {
- selectItem.call(this, 1, true);
- },
- __onPageUp: function () {
-
- },
- __onPageDown: function () {
-
- },
- __onBeforeShow: function (event) {
- },
- __onEnter: function (event) {
- this.__onChangeValue(event, getSelectedItemValue.call(this));
- //rf.getDomElement(this.fieldId).blur();
- //rf.Selection.setCaretTo(rf.getDomElement(this.fieldId));
- //rf.getDomElement(this.fieldId).focus();
- },
- __onShow: function (event) {
- if (event.which != rf.KEYS.BACKSPACE) {
- if(this.items && this.items.length>0){
- if (this.index!=0 && this.options.selectFirst) {
- selectItem.call(this, 0);
- }
- }
- }
- },
- __onHide: function () {
- selectItem.call(this);
- },
- /*
- * Destructor
- */
- destroy: function () {
- //TODO: add all unbind
- this.items = null;
- this.cache = null;
- var itemsContainer = rf.getDomElement(this.id+ID.ITEMS);
- $(itemsContainer).removeData();
- rf.Event.unbind(itemsContainer.parentNode, this.namespace);
- $super.destroy.call(this);
- }
- };
- })());
-})(jQuery, RichFaces);
\ No newline at end of file
Deleted:
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoCompleteBase.js
===================================================================
---
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoCompleteBase.js 2010-08-17
19:15:21 UTC (rev 18736)
+++
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutoCompleteBase.js 2010-08-17
19:30:38 UTC (rev 18737)
@@ -1,297 +0,0 @@
-// TODO: move this extend to RichFaces.Event for exapmle
-$.extend(RichFaces.Event, {
- bindScrollEventHandlers: function(element, handler, component) {
- var elements = [];
- element = RichFaces.getDomElement(element).parentNode;
- while (element && element!=window.document.body)
- {
- if (element.offsetWidth!=element.scrollWidth ||
element.offsetHeight!=element.scrollHeight)
- {
- elements.push(element);
- RichFaces.Event.bind(element, "scroll"+component.getNamespace(), handler,
component);
- }
- element = element.parentNode;
- }
- return elements;
- },
- unbindScrollEventHandlers: function(elements, component) {
- RichFaces.Event.unbind(elements, component.getNamespace());
- }
-});
-
-(function (rf) {
- rf.KEYS = {
- BACKSPACE: 8,
- TAB: 9,
- RETURN: 13,
- ESC: 27,
- PAGEUP: 33,
- PAGEDOWN: 34,
- LEFT: 37,
- UP: 38,
- RIGHT: 39,
- DOWN: 40,
- DEL: 46,
- }
-})(RichFaces);
-
-(function ($, rf) {
-
- rf.ui = rf.ui || {};
-
- // Constructor definition
- rf.ui.AutoCompleteBase = function(componentId, selectId, fieldId, options) {
- // call constructor of parent class
- $super.constructor.call(this, componentId);
- this.selectId = selectId;
- this.fieldId = fieldId;
- this.options = $.extend({}, defaultOptions, options);
- this.namespace = this.namespace || "."+rf.Event.createNamespace(this.name,
this.selectId);
- this.currentValue = this.getInputValue();
- bindEventHandlers.call(this);
- };
-
- // Extend component class and add protected methods from parent class to our container
- rf.BaseComponent.extend(rf.ui.AutoCompleteBase);
-
- // define super class link
- var $super = rf.ui.AutoCompleteBase.$super;
-
- var defaultOptions = {
- changeDelay:8
- };
-
- var bindEventHandlers = function() {
-
- var inputEventHandlers = {};
-
- if (this.options.buttonId && !this.options.disabled) {
- inputEventHandlers["mousedown"+this.namespace] = onButtonShow;
- inputEventHandlers["mouseup"+this.namespace] = onSelectMouseUp;
- rf.Event.bindById(this.options.buttonId, inputEventHandlers, this);
- }
-
- inputEventHandlers = {};
- inputEventHandlers["focus"+this.namespace] = onFocus;
- inputEventHandlers["blur"+this.namespace] = onBlur;
- inputEventHandlers["click"+this.namespace] = onClick;
- inputEventHandlers[($.browser.opera ? "keypress" :
"keydown")+this.namespace] = onKeyDown;
- rf.Event.bindById(this.fieldId, inputEventHandlers, this);
-
- inputEventHandlers = {};
- inputEventHandlers["mousedown"+this.namespace] = onSelectMouseDown;
- inputEventHandlers["mouseup"+this.namespace] = onSelectMouseUp;
- rf.Event.bindById(this.selectId, inputEventHandlers, this);
- };
-
- var onSelectMouseDown = function () {
- this.isMouseDown = true;
- };
- var onSelectMouseUp = function () {
- rf.getDomElement(this.fieldId).focus();
- };
-
- var onButtonShow = function (event) {
- this.isMouseDown = true;
- if (this.timeoutId) {
- window.clearTimeout(this.timeoutId);
- this.timeoutId = null;
- rf.getDomElement(this.fieldId).focus();
- }
-
- if (this.isVisible) {
- this.hide(event);
- } else {
- onShow.call(this, event);
- }
- };
-
- var onFocus = function (event) {
- };
-
- var onBlur = function (event) {
- if (this.isMouseDown) {
- rf.getDomElement(this.fieldId).focus();
- this.isMouseDown = false;
- } else if (this.isVisible && !this.isMouseDown) {
- var _this = this;
- this.timeoutId = window.setTimeout(function(){_this.hide();}, 200);
- }
- };
-
- var onClick = function (event) {
- };
-
- var onChange = function (event) {
- var value = this.getInputValue();
- var flag = value != this.currentValue;
- //TODO: is it needed to chesk keys?
- //TODO: we need to set value when autoFill used when LEFT or RIGHT was pressed
- if (event.which == rf.KEYS.LEFT || event.which == rf.KEYS.RIGHT || flag) {
- if (flag || this.isVisible) {
- this.__onChangeValue(event);
- }
- if (flag) {
- this.currentValue = this.getInputValue();
- if(value && value.length>=this.options.minChars){
- onShow.call(this, event);
- }
-
- }
- }
- };
-
- var onShow = function (event) {
- this.__updateState(event);
- this.show(event);
- };
-
- var onKeyDown = function (event) {
- switch(event.which) {
- case rf.KEYS.UP:
- event.preventDefault();
- if (this.isVisible) {
- this.__onKeyUp(event);
- }
- break;
- case rf.KEYS.DOWN:
- event.preventDefault();
- if (this.isVisible) {
- this.__onKeyDown(event);
- } else {
- onShow.call(this, event);
- }
- break;
- case rf.KEYS.PAGEUP:
- event.preventDefault();
- if (this.isVisible) {
- this.__onPageUp(event);
- }
- break;
- case rf.KEYS.PAGEDOWN:
- event.preventDefault();
- if (this.isVisible) {
- this.__onPageDown(event);
- }
- break;
- case rf.KEYS.RETURN:
-
- event.preventDefault();
- this.__onEnter(event);
- //TODO: bind form submit event handler to cancel form submit under the opera
- //cancelSubmit = true;
- this.hide();
- return false;
- break;
- case rf.KEYS.ESC:
- this.hide();
- break;
- default:
- if (!this.options.selectOnly) {
- var _this = this;
- window.clearTimeout(this.changeTimerId);
- this.changeTimerId = window.setTimeout(function(){onChange.call(_this, event);},
this.options.changeDelay)
- }
- break;
- }
- }
-
- /*
- * public API functions definition
- */
- var show = function (event, showButtonPressed) {
- if (!this.isVisible) {
- if (this.__onBeforeShow(event)!=false) {
- this.scrollElements = rf.Event.bindScrollEventHandlers(this.selectId, this.hide,
this, this.namespace);
- if (this.options.attachToBody) {
- var element = rf.getDomElement(this.selectId);
- this.parentElement = element.parentNode;
- $(element).detach().appendTo("body");
- }
- $(rf.getDomElement(this.selectId)).setPosition({id: this.fieldId},
{type:"DROPDOWN", offset:[0,20]}).show();
- this.isVisible = true;
- this.__onShow(event, showButtonPressed);
- }
- }
- };
- var hide = function (event) {
- if (this.isVisible) {
- rf.Event.unbindScrollEventHandlers(this.scrollElements, this);
- this.scrollElements = null;
- $(rf.getDomElement(this.selectId)).hide();
- this.isVisible = false;
- if (this.options.attachToBody && this.parentElement) {
- $(rf.getDomElement(this.selectId)).detach().appendTo(this.parentElement);
- this.parentElement = null;
- }
- this.__onHide(event);
- }
- };
-
- /*
- * Prototype definition
- */
- $.extend(rf.ui.AutoCompleteBase.prototype, (function () {
- return {
- /*
- * public API functions
- */
- name:"AutoCompleteBase",
- show: show,
- hide: hide,
- getNamespace: function () {
- return this.namespace;
- },
- getInputValue: function () {
- return this.fieldId ? rf.getDomElement(this.fieldId).value : "";
- },
- setInputValue: function (value) {
- this.currentValue = this.__updateInputValue(value);
- },
- /*
- * Protected methods
- */
- __updateInputValue: function (value) {
- if (this.fieldId) {
- rf.getDomElement(this.fieldId).value = value;
- return value;
- } else {
- return "";
- }
- },
- /*
- * abstract protected methods
- */
- __onChangeValue: function (event) {
- },
- __onKeyUp: function () {
- },
- __onKeyDown: function () {
- },
- __onPageUp: function () {
- },
- __onPageDown: function () {
- },
- __onBeforeShow: function () {
- },
- __onShow: function () {
- },
- __onHide: function () {
- },
- /*
- * Destructor
- */
- destroy: function () {
- this.parentNode = null;
- if (this.scrollElements) {
- rf.Event.unbindScrollEventHandlers(this.scrollElements, this);
- this.scrollElements = null;
- }
- this.options.buttonId && rf.Event.unbindById(this.options.buttonId,
this.namespace);
- rf.Event.unbindById(this.fieldId, this.namespace);
- rf.Event.unbindById(this.selectId, this.namespace);
- $super.destroy.call(this);
- }
- };
- })());
-})(jQuery, RichFaces);
\ No newline at end of file
Copied:
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/Autocomplete.ecss
(from rev 18736,
branches/RF-9096/src/main/resources/META-INF/resources/org.richfaces/Autocomplete.ecss)
===================================================================
---
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/Autocomplete.ecss
(rev 0)
+++
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/Autocomplete.ecss 2010-08-17
19:30:38 UTC (rev 18737)
@@ -0,0 +1,152 @@
+.rf-au-f-w{
+ width: 200px;
+}
+
+.rf-au-l-w{
+ width: 200px;
+}
+
+.rf-au-l-h{
+ max-height: 100px;
+ min-height: 20px;
+}
+
+.rf-au-i.rf-au-ft, .rf-au-o.rf-au-ft{
+ color: '#{richSkin.generalTextColor}';
+ font-size: '#{richSkin.generalSizeFont}';
+ font-family: '#{richSkin.generalFamilyFont}';
+}
+
+input.rf-au-i {
+ border-width: 0px;
+ background: none;
+ width: 100%;
+}
+
+.rf-au-f{
+ position: inline-block;
+ border-width: 1px;
+ border-style: solid;
+ border-color: '#{richSkin.panelBorderColor}';
+ display: inline-block;
+ background-image:
"url(#{resource['org.richfaces.renderkit.html.images.AutocompleteFieldGradient']})";
+ background-repeat: repeat-x;
+ background-position: top left;
+ background-color: '#{richSkin.controlBackgroundColor}';
+}
+
+.rf-au-b{
+ background-image:
"url(#{resource['org.richfaces.renderkit.html.images.AutocompleteButtonGradient']})";
+ background-repeat: repeat-x;
+ background-position: top left;
+ background-color: '#{richSkin.headerBackgroundColor}';
+ text-align: center;
+ border-left-style: solid;
+ border-left-width: 1px;
+ border-left-color: '#{richSkin.panelBorderColor}';
+ width: 15px;
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ height: 200px;
+ padding-top: 1px
+}
+
+.rf-au-b-a{
+ background-position: center;
+ background-repeat: no-repeat;
+ background-image:
"url(#{resource['org.richfaces:combo_down_button.gif']})";
+ cursor: pointer;
+ width: 15px;
+ height: 15px;
+}
+
+.rf-au-l-c{
+ position: absolute;
+ /* TODO nick - review: font-size: 0px; */
+ display: none;
+}
+
+.rf-au-l-d{
+ border-width: 1px;
+ border-style: solid;
+ border-color: '#{richSkin.panelBorderColor}';
+ padding: 0px;
+ background-color: '#{richSkin.tableBackgroundColor}';
+}
+
+.rf-au-l-s{
+ overflow: auto;
+ overflow-x: hidden;
+}
+
+.rf-au-o{
+ padding: 2px;
+ white-space: nowrap;
+ cursor: default;
+ list-style-type: none;
+}
+
+.rf-au-s{
+ padding: 1px;
+ width: 100%;
+ background-color: '#{richSkin.headerBackgroundColor}';
+ border-width: 1px;
+ border-style: dotted;
+ border-color: '#{richSkin.generalTextColor}';
+}
+
+.rf-au-shw{
+ border: 0px solid red;
+ display: inline-block;
+ position: absolute;
+ float: left;
+ padding: 6px 6px 6px 6px;
+ top: -6px;
+ left: -7px;
+}
+
+.rf-au-shw-t{
+ background-image:
"url(#{resource['org.richfaces:combo_list_shadow.png']})";
+ background-position: top left;
+ position: absolute;
+ width: 6px;
+ top: 0px;
+ bottom: 6px;
+ left: 0px
+}
+
+.rf-au-shw-l{
+ background-image:
"url(#{resource['org.richfaces:combo_list_shadow.png']})";
+ background-position: bottom left;
+ position: absolute;
+ height: 6px;
+ bottom: 0px;
+ left: 0px;
+ right: 6px;
+}
+
+.rf-au-shw-r{
+ background-image:
"url(#{resource['org.richfaces:combo_list_shadow.png']})";
+ background-position: bottom right;
+ position: absolute;
+ width: 6px;
+ top: 6px;
+ bottom: 0px;
+ right: 0px;
+}
+
+.rf-au-shw-b{
+ background-image:
"url(#{resource['org.richfaces:combo_list_shadow.png']})";
+ background-position: right top;
+ position: absolute;
+ height: 6px;
+ top: 0px;
+ left: 6px;
+ right: 0px;
+}
+
+.rf-au-l-ul{
+ margin: 0px;
+ padding: 0px;
+}
\ No newline at end of file
Copied:
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/Autocomplete.js
(from rev 18736,
branches/RF-9096/src/main/resources/META-INF/resources/org.richfaces/Autocomplete.js)
===================================================================
--- trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/Autocomplete.js
(rev 0)
+++
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/Autocomplete.js 2010-08-17
19:30:38 UTC (rev 18737)
@@ -0,0 +1,408 @@
+(function ($, rf) {
+ rf.utils = rf.utils || {};
+
+ rf.utils.Cache = function (key, items, values) {
+ this.key = key;
+ this.cache = {}
+ this.cache[this.key] = items || [];
+ this.values = typeof values != "function" ? values || this.cache[this.key] :
values(items);
+ };
+
+ var getItems = function (key) {
+ var newCache = [];
+
+ if (key.length < this.key.length) {
+ return newCache;
+ }
+
+ if (this.cache[key]) {
+ newCache = this.cache[key];
+ } else {
+ var itemsCache = this.cache[this.key];
+ for (var i = 0; i<this.values.length; i++) {
+ var value = this.values[i].toLowerCase();
+ var p = value.indexOf(key.toLowerCase());
+ if (p == 0) {
+ newCache.push(itemsCache[i]);
+ }
+ }
+
+ if ((!this.lastKey || key.indexOf(this.lastKey)!=0) && newCache.length > 0)
{
+ this.cache[key] = newCache;
+ if (newCache.length==1) {
+ this.lastKey = key;
+ }
+ }
+ }
+
+ return newCache;
+ };
+
+ var getItemValue = function (item) {
+ return this.values[this.cache[this.key].index(item)];
+ };
+
+ var isCached = function (key) {
+ return this.cache[key];
+ };
+
+ $.extend(rf.utils.Cache.prototype, (function () {
+ return {
+ getItems: getItems,
+ getItemValue: getItemValue,
+ isCached: isCached
+ };
+ })());
+
+})(jQuery, RichFaces);
+
+(function ($, rf) {
+
+ /*
+ * TODO: add user's event handlers call from options
+ * TODO: add fire events
+ */
+
+ rf.ui = rf.ui || {};
+ // Constructor definition
+ rf.ui.Autocomplete = function(componentId, fieldId, options) {
+ this.namespace = "."+rf.Event.createNamespace(this.name, this.id);
+ this.options = {};
+ // call constructor of parent class
+ $super.constructor.call(this, componentId, componentId+ID.SELECT, fieldId, options);
+ this.attachToDom(componentId);
+ this.options = $.extend(this.options, defaultOptions, options);
+ this.value = this.__getSubValue();
+ this.index = -1;
+ this.isFirstAjax = true;
+ updateTokenOptions.call(this);
+ bindEventHandlers.call(this);
+ updateItemsList.call(this, "");
+ };
+
+ // Extend component class and add protected methods from parent class to our container
+ rf.ui.AutocompleteBase.extend(rf.ui.Autocomplete);
+
+ // define super class link
+ var $super = rf.ui.Autocomplete.$super;
+
+ var defaultOptions = {
+ selectedItemClass:'rf-au-s',
+ autoFill:true,
+ minChars:1,
+ selectFirst:true,
+ ajaxMode:true,
+ tokens: ",",
+ attachToBody:true
+ };
+
+ var ID = {
+ SELECT:'List',
+ ITEMS:'Items',
+ VALUE:'Value'
+ };
+
+ var REGEXP_TRIM = /^[\n\s]*(.*)[\n\s]*$/;
+ var REGEXP_TOKEN_LEFT;
+ var REGEXP_TOKEN_RIGHT;
+
+ var getData = function (nodeList) {
+ var data = [];
+ nodeList.each(function () {;
+ data.push($(this).text().replace(REGEXP_TRIM, "$1"));
+ });
+ return data;
+ }
+
+ var updateTokenOptions = function () {
+ this.useTokens = (typeof this.options.tokens == "string" &&
this.options.tokens.length>0);
+ if (this.useTokens) {
+ var escapedTokens = this.options.tokens.split('').join("\\");
+ REGEXP_TOKEN_LEFT = new RegExp('[^'+escapedTokens+']+$','i');
+ REGEXP_TOKEN_RIGHT = new RegExp('['+escapedTokens+']','i');
+ this.hasSpaceToken = this.options.tokens.indexOf(' ')!=-1;
+ };
+ };
+
+ var bindEventHandlers = function () {
+ rf.Event.bind(rf.getDomElement(this.id+ID.ITEMS).parentNode,
"click"+this.namespace+" mouseover"+this.namespace, onMouseAction,
this);
+ };
+
+ var onMouseAction = function(event) {
+ var element = $(event.target).closest(".rf-ac-i",
event.currentTarget).get(0);
+
+ if (element) {
+ if (event.type=="mouseover") {
+ var index = this.items.index(element);
+ if (index!=this.index) {
+ selectItem.call(this, index);
+ }
+ } else {
+ this.__onChangeValue(event, getSelectedItemValue.call(this));
+ rf.Selection.setCaretTo(rf.getDomElement(this.fieldId));
+ this.hide(event);
+ }
+ }
+ };
+
+ var updateItemsList = function (value, fetchValues) {
+ this.items = $(rf.getDomElement(this.id+ID.ITEMS)).find(".rf-ac-i");
+ if (this.items.length>0) {
+ this.cache = new rf.utils.Cache(value, this.items, fetchValues || getData);
+ }
+ };
+
+ var scrollToSelectedItem = function() {
+ var offset = 0;
+ this.items.slice(0, this.index).each(function() {
+ offset += this.offsetHeight;
+ });
+ var parentContainer = $(rf.getDomElement(this.id+ID.ITEMS)).parent();
+ if(offset < parentContainer.scrollTop()) {
+ parentContainer.scrollTop(offset);
+ } else {
+ offset+=this.items.get(this.index).offsetHeight;
+ if(offset - parentContainer.scrollTop() >
parentContainer.get(0).clientHeight) {
+ parentContainer.scrollTop(offset - parentContainer.innerHeight());
+ }
+ }
+ };
+
+ var autoFill = function (inputValue, value) {
+ if( this.options.autoFill) {
+ var field = rf.getDomElement(this.fieldId);
+ var start = rf.Selection.getStart(field);
+ this.setInputValue(inputValue + value.substring(inputValue.length));
+ var end = start+value.length - inputValue.length;
+ rf.Selection.set(field, start, end);
+ }
+ };
+
+ var callAjax = function(event, value) {
+
+ $(rf.getDomElement(this.id+ID.ITEMS)).removeData().empty();
+ rf.getDomElement(this.id+ID.VALUE).value = value;
+
+ var _this = this;
+ var ajaxSuccess = function (event) {
+ updateItemsList.call(_this, _this.value, event.componentData &&
event.componentData[_this.id]);
+ if (_this.isVisible && _this.options.selectFirst) {
+ selectItem.call(_this, 0);
+ }
+ }
+
+ var ajaxError = function (event) {
+ //alert("error");
+ }
+
+ this.isFirstAjax = false;
+ //caution: JSF submits inputs with empty names causing "WARNING: Parameters:
Invalid chunk ignored." in Tomcat log
+ var params = {};
+ params[this.id + ".ajax"] = "1";
+ rf.ajax(this.id, event, {parameters: params, error: ajaxError, complete:ajaxSuccess});
+ };
+
+ var selectItem = function(index, isOffset, noAutoFill) {
+ if (this.items.length==0) return;
+
+ if (this.index!=-1) {
+ this.items.eq(this.index).removeClass(this.options.selectedItemClass);
+ }
+
+ if (index==undefined) {
+ this.index = -1;
+ return;
+ }
+
+ if (isOffset) {
+ this.index += index;
+ if ( this.index<0 ) {
+ this.index = this.items.length - 1;
+ } else if (this.index >= this.items.length) {
+ this.index = 0;
+ }
+ } else {
+ if (index<0) {
+ index = 0;
+ } else if (index>=this.items.length) {
+ index = this.items.length - 1;
+ }
+ this.index = index;
+ }
+ var item = this.items.eq(this.index);
+ item.addClass(this.options.selectedItemClass);
+ scrollToSelectedItem.call(this);
+ !noAutoFill && autoFill.call(this, this.value,
getSelectedItemValue.call(this));
+ };
+
+ var onChangeValue = function (event, value) {
+ //if(this.options.onchange){
+ //this.options.onchange.call(this, event);
+ //}
+ selectItem.call(this);
+
+ // value is undefined if called from AutocompleteBase onChange
+ var subValue = (typeof value == "undefined") ? this.__getSubValue() : value;
+
+ // TODO: ajax call here if needed
+ if ((!this.cache || subValue.length==0 ||
subValue.toLowerCase().indexOf(this.cache.key.toLowerCase())!=0) &&
+ subValue.length>=this.options.minChars) {
+ this.value = subValue;
+ this.options.ajaxMode && callAjax.call(this, event, subValue);
+ return;
+ }
+ if(!this.cache){
+ return;
+ }
+ var newItems = this.cache.getItems(subValue);
+ this.items = $(newItems);
+ //TODO: works only with simple markup, not with <tr>
+ $(rf.getDomElement(this.id+ID.ITEMS)).empty().append(newItems);
+ this.index = -1;
+ this.value = subValue;
+ if (subValue.length<this.options.minChars){
+ this.hide();
+ }
+ if (this.options.selectFirst) {
+ if (event.which == rf.KEYS.RETURN || event.type == "click") {
+ this.setInputValue(subValue);
+ return;
+ } else {
+ selectItem.call(this, 0, false, event.which == rf.KEYS.BACKSPACE || event.which ==
rf.KEYS.LEFT || event.which == rf.KEYS.RIGHT);
+ return;
+ }
+ }
+ this.setInputValue(subValue);
+ };
+
+ var getSelectedItemValue = function () {
+ if ( this.index>=0) {
+ var element = this.items.eq(this.index);
+ return this.cache.getItemValue(element);
+ }
+ return undefined;
+ };
+
+ var getSubValue = function () {
+ //TODO: add posibility to use space chars before and after tokens if space not a token
char
+ if (this.useTokens) {
+ var field = rf.getDomElement(this.fieldId);
+ var value = field.value;
+ var cursorPosition = rf.Selection.getStart(field);
+ var beforeCursorStr = value.substring(0, cursorPosition);
+ var afterCursorStr = value.substring(cursorPosition);
+ var r = REGEXP_TOKEN_LEFT.exec(beforeCursorStr);
+ var result = "";
+ if (r) {
+ result = r[0];
+ }
+ r = afterCursorStr.search(REGEXP_TOKEN_RIGHT);
+ if (r==-1) r = afterCursorStr.length;
+ result += afterCursorStr.substring(0, r);
+
+ return result;
+ } else {
+ return this.getInputValue();
+ }
+ };
+
+ var updateInputValue = function (value) {
+ var field = rf.getDomElement(this.fieldId);
+ var inputValue = field.value;
+
+ var cursorPosition = rf.Selection.getStart(field);
+ var beforeCursorStr = inputValue.substring(0, cursorPosition);
+ var afterCursorStr = inputValue.substring(cursorPosition);
+
+ var pos = beforeCursorStr.search(REGEXP_TOKEN_LEFT);
+ var startPos = pos!=-1 ? pos : beforeCursorStr.length;
+ pos = afterCursorStr.search(REGEXP_TOKEN_RIGHT);
+ var endPos = pos!=-1 ? pos : afterCursorStr.length;
+
+ var beginNewValue = inputValue.substring(0, startPos) + value;
+ cursorPosition = beginNewValue.length;
+ field.value = beginNewValue + afterCursorStr.substring(endPos);
+ field.focus();
+ rf.Selection.setCaretTo(field, cursorPosition);
+ return field.value;
+ };
+
+ /*
+ * Prototype definition
+ */
+ $.extend(rf.ui.Autocomplete.prototype, (function () {
+ return {
+ /*
+ * public API functions
+ */
+ name:"Autocomplete",
+ /*
+ * Protected methods
+ */
+ __updateState: function (event) {
+ var subValue = this.__getSubValue();
+ // called from onShow method, not actually value changed
+ if (this.items.length==0 && this.isFirstAjax) {
+ this.options.ajaxMode && callAjax.call(this, event, subValue);
+ }
+ return;
+ },
+ __getSubValue: getSubValue,
+ __updateInputValue: function (value) {
+ if (this.useTokens) {
+ return updateInputValue.call(this, value);
+ } else {
+ return $super.__updateInputValue.call(this, value);
+ }
+ },
+ __onChangeValue: onChangeValue,
+ /*
+ * Override abstract protected methods
+ */
+ __onKeyUp: function () {
+ selectItem.call(this, -1, true);
+ },
+ __onKeyDown: function () {
+ selectItem.call(this, 1, true);
+ },
+ __onPageUp: function () {
+
+ },
+ __onPageDown: function () {
+
+ },
+ __onBeforeShow: function (event) {
+ },
+ __onEnter: function (event) {
+ this.__onChangeValue(event, getSelectedItemValue.call(this));
+ //rf.getDomElement(this.fieldId).blur();
+ //rf.Selection.setCaretTo(rf.getDomElement(this.fieldId));
+ //rf.getDomElement(this.fieldId).focus();
+ },
+ __onShow: function (event) {
+ if (event.which != rf.KEYS.BACKSPACE) {
+ if(this.items && this.items.length>0){
+ if (this.index!=0 && this.options.selectFirst) {
+ selectItem.call(this, 0);
+ }
+ }
+ }
+ },
+ __onHide: function () {
+ selectItem.call(this);
+ },
+ /*
+ * Destructor
+ */
+ destroy: function () {
+ //TODO: add all unbind
+ this.items = null;
+ this.cache = null;
+ var itemsContainer = rf.getDomElement(this.id+ID.ITEMS);
+ $(itemsContainer).removeData();
+ rf.Event.unbind(itemsContainer.parentNode, this.namespace);
+ $super.destroy.call(this);
+ }
+ };
+ })());
+})(jQuery, RichFaces);
\ No newline at end of file
Copied:
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutocompleteBase.js
(from rev 18736,
branches/RF-9096/src/main/resources/META-INF/resources/org.richfaces/AutocompleteBase.js)
===================================================================
---
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutocompleteBase.js
(rev 0)
+++
trunk/ui/input/ui/src/main/resources/META-INF/resources/org.richfaces/AutocompleteBase.js 2010-08-17
19:30:38 UTC (rev 18737)
@@ -0,0 +1,297 @@
+// TODO: move this extend to RichFaces.Event for exapmle
+$.extend(RichFaces.Event, {
+ bindScrollEventHandlers: function(element, handler, component) {
+ var elements = [];
+ element = RichFaces.getDomElement(element).parentNode;
+ while (element && element!=window.document.body)
+ {
+ if (element.offsetWidth!=element.scrollWidth ||
element.offsetHeight!=element.scrollHeight)
+ {
+ elements.push(element);
+ RichFaces.Event.bind(element, "scroll"+component.getNamespace(), handler,
component);
+ }
+ element = element.parentNode;
+ }
+ return elements;
+ },
+ unbindScrollEventHandlers: function(elements, component) {
+ RichFaces.Event.unbind(elements, component.getNamespace());
+ }
+});
+
+(function (rf) {
+ rf.KEYS = {
+ BACKSPACE: 8,
+ TAB: 9,
+ RETURN: 13,
+ ESC: 27,
+ PAGEUP: 33,
+ PAGEDOWN: 34,
+ LEFT: 37,
+ UP: 38,
+ RIGHT: 39,
+ DOWN: 40,
+ DEL: 46,
+ }
+})(RichFaces);
+
+(function ($, rf) {
+
+ rf.ui = rf.ui || {};
+
+ // Constructor definition
+ rf.ui.AutocompleteBase = function(componentId, selectId, fieldId, options) {
+ // call constructor of parent class
+ $super.constructor.call(this, componentId);
+ this.selectId = selectId;
+ this.fieldId = fieldId;
+ this.options = $.extend({}, defaultOptions, options);
+ this.namespace = this.namespace || "."+rf.Event.createNamespace(this.name,
this.selectId);
+ this.currentValue = this.getInputValue();
+ bindEventHandlers.call(this);
+ };
+
+ // Extend component class and add protected methods from parent class to our container
+ rf.BaseComponent.extend(rf.ui.AutocompleteBase);
+
+ // define super class link
+ var $super = rf.ui.AutocompleteBase.$super;
+
+ var defaultOptions = {
+ changeDelay:8
+ };
+
+ var bindEventHandlers = function() {
+
+ var inputEventHandlers = {};
+
+ if (this.options.buttonId && !this.options.disabled) {
+ inputEventHandlers["mousedown"+this.namespace] = onButtonShow;
+ inputEventHandlers["mouseup"+this.namespace] = onSelectMouseUp;
+ rf.Event.bindById(this.options.buttonId, inputEventHandlers, this);
+ }
+
+ inputEventHandlers = {};
+ inputEventHandlers["focus"+this.namespace] = onFocus;
+ inputEventHandlers["blur"+this.namespace] = onBlur;
+ inputEventHandlers["click"+this.namespace] = onClick;
+ inputEventHandlers[($.browser.opera ? "keypress" :
"keydown")+this.namespace] = onKeyDown;
+ rf.Event.bindById(this.fieldId, inputEventHandlers, this);
+
+ inputEventHandlers = {};
+ inputEventHandlers["mousedown"+this.namespace] = onSelectMouseDown;
+ inputEventHandlers["mouseup"+this.namespace] = onSelectMouseUp;
+ rf.Event.bindById(this.selectId, inputEventHandlers, this);
+ };
+
+ var onSelectMouseDown = function () {
+ this.isMouseDown = true;
+ };
+ var onSelectMouseUp = function () {
+ rf.getDomElement(this.fieldId).focus();
+ };
+
+ var onButtonShow = function (event) {
+ this.isMouseDown = true;
+ if (this.timeoutId) {
+ window.clearTimeout(this.timeoutId);
+ this.timeoutId = null;
+ rf.getDomElement(this.fieldId).focus();
+ }
+
+ if (this.isVisible) {
+ this.hide(event);
+ } else {
+ onShow.call(this, event);
+ }
+ };
+
+ var onFocus = function (event) {
+ };
+
+ var onBlur = function (event) {
+ if (this.isMouseDown) {
+ rf.getDomElement(this.fieldId).focus();
+ this.isMouseDown = false;
+ } else if (this.isVisible && !this.isMouseDown) {
+ var _this = this;
+ this.timeoutId = window.setTimeout(function(){_this.hide();}, 200);
+ }
+ };
+
+ var onClick = function (event) {
+ };
+
+ var onChange = function (event) {
+ var value = this.getInputValue();
+ var flag = value != this.currentValue;
+ //TODO: is it needed to chesk keys?
+ //TODO: we need to set value when autoFill used when LEFT or RIGHT was pressed
+ if (event.which == rf.KEYS.LEFT || event.which == rf.KEYS.RIGHT || flag) {
+ if (flag || this.isVisible) {
+ this.__onChangeValue(event);
+ }
+ if (flag) {
+ this.currentValue = this.getInputValue();
+ if(value && value.length>=this.options.minChars){
+ onShow.call(this, event);
+ }
+
+ }
+ }
+ };
+
+ var onShow = function (event) {
+ this.__updateState(event);
+ this.show(event);
+ };
+
+ var onKeyDown = function (event) {
+ switch(event.which) {
+ case rf.KEYS.UP:
+ event.preventDefault();
+ if (this.isVisible) {
+ this.__onKeyUp(event);
+ }
+ break;
+ case rf.KEYS.DOWN:
+ event.preventDefault();
+ if (this.isVisible) {
+ this.__onKeyDown(event);
+ } else {
+ onShow.call(this, event);
+ }
+ break;
+ case rf.KEYS.PAGEUP:
+ event.preventDefault();
+ if (this.isVisible) {
+ this.__onPageUp(event);
+ }
+ break;
+ case rf.KEYS.PAGEDOWN:
+ event.preventDefault();
+ if (this.isVisible) {
+ this.__onPageDown(event);
+ }
+ break;
+ case rf.KEYS.RETURN:
+
+ event.preventDefault();
+ this.__onEnter(event);
+ //TODO: bind form submit event handler to cancel form submit under the opera
+ //cancelSubmit = true;
+ this.hide();
+ return false;
+ break;
+ case rf.KEYS.ESC:
+ this.hide();
+ break;
+ default:
+ if (!this.options.selectOnly) {
+ var _this = this;
+ window.clearTimeout(this.changeTimerId);
+ this.changeTimerId = window.setTimeout(function(){onChange.call(_this, event);},
this.options.changeDelay)
+ }
+ break;
+ }
+ }
+
+ /*
+ * public API functions definition
+ */
+ var show = function (event, showButtonPressed) {
+ if (!this.isVisible) {
+ if (this.__onBeforeShow(event)!=false) {
+ this.scrollElements = rf.Event.bindScrollEventHandlers(this.selectId, this.hide,
this, this.namespace);
+ if (this.options.attachToBody) {
+ var element = rf.getDomElement(this.selectId);
+ this.parentElement = element.parentNode;
+ $(element).detach().appendTo("body");
+ }
+ $(rf.getDomElement(this.selectId)).setPosition({id: this.fieldId},
{type:"DROPDOWN", offset:[0,20]}).show();
+ this.isVisible = true;
+ this.__onShow(event, showButtonPressed);
+ }
+ }
+ };
+ var hide = function (event) {
+ if (this.isVisible) {
+ rf.Event.unbindScrollEventHandlers(this.scrollElements, this);
+ this.scrollElements = null;
+ $(rf.getDomElement(this.selectId)).hide();
+ this.isVisible = false;
+ if (this.options.attachToBody && this.parentElement) {
+ $(rf.getDomElement(this.selectId)).detach().appendTo(this.parentElement);
+ this.parentElement = null;
+ }
+ this.__onHide(event);
+ }
+ };
+
+ /*
+ * Prototype definition
+ */
+ $.extend(rf.ui.AutocompleteBase.prototype, (function () {
+ return {
+ /*
+ * public API functions
+ */
+ name:"AutocompleteBase",
+ show: show,
+ hide: hide,
+ getNamespace: function () {
+ return this.namespace;
+ },
+ getInputValue: function () {
+ return this.fieldId ? rf.getDomElement(this.fieldId).value : "";
+ },
+ setInputValue: function (value) {
+ this.currentValue = this.__updateInputValue(value);
+ },
+ /*
+ * Protected methods
+ */
+ __updateInputValue: function (value) {
+ if (this.fieldId) {
+ rf.getDomElement(this.fieldId).value = value;
+ return value;
+ } else {
+ return "";
+ }
+ },
+ /*
+ * abstract protected methods
+ */
+ __onChangeValue: function (event) {
+ },
+ __onKeyUp: function () {
+ },
+ __onKeyDown: function () {
+ },
+ __onPageUp: function () {
+ },
+ __onPageDown: function () {
+ },
+ __onBeforeShow: function () {
+ },
+ __onShow: function () {
+ },
+ __onHide: function () {
+ },
+ /*
+ * Destructor
+ */
+ destroy: function () {
+ this.parentNode = null;
+ if (this.scrollElements) {
+ rf.Event.unbindScrollEventHandlers(this.scrollElements, this);
+ this.scrollElements = null;
+ }
+ this.options.buttonId && rf.Event.unbindById(this.options.buttonId,
this.namespace);
+ rf.Event.unbindById(this.fieldId, this.namespace);
+ rf.Event.unbindById(this.selectId, this.namespace);
+ $super.destroy.call(this);
+ }
+ };
+ })());
+})(jQuery, RichFaces);
\ No newline at end of file
Deleted: trunk/ui/input/ui/src/main/templates/autoComplete.template.xml
===================================================================
--- trunk/ui/input/ui/src/main/templates/autoComplete.template.xml 2010-08-17 19:15:21 UTC
(rev 18736)
+++ trunk/ui/input/ui/src/main/templates/autoComplete.template.xml 2010-08-17 19:30:38 UTC
(rev 18737)
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<cdk:root
xmlns="http://richfaces.org/cdk/xhtml-el"
xmlns:cdk="http://richfaces.org/cdk/core"
-
xmlns:c="http://richfaces.org/cdk/jstl/core"
xmlns:cc="http://richfaces.org/cdk/jsf/composite"
-
xmlns:javaee="http://java.sun.com/xml/ns/javaee">
-
- <cc:interface>
-
<cdk:class>org.richfaces.renderkit.html.AutoCompleteRenderer</cdk:class>
-
<cdk:superclass>org.richfaces.renderkit.AutoCompleteRendererBase</cdk:superclass>
- <cdk:component-family>javax.faces.Input</cdk:component-family>
- <cdk:renderer-type>org.richfaces.AutoCompleteRenderer
- </cdk:renderer-type>
- <cdk:renders-children>true</cdk:renders-children>
- </cc:interface>
-
- <cc:implementation>
- <cdk:object type="java.lang.Object" name="disabled"
value="#{component.attributes['disabled']}" />
- <div id="#{clientId}" class="rf-au-f-w rf-au-f">
- <input id="#{clientId}Value" name="#{clientId}Value"
type="hidden" class="rf-au-ft rf-au-i" />
- <div style="position : relative; overflow : hidden; text-align :
left; padding-right : 21px;">
- <input onclick="#{component.attributes['onclick']}"
- ondblclick="#{component.attributes['ondblclick']}"
- onmouseup="#{component.attributes['onmouseup']}"
- onmousedown="#{component.attributes['onmousedown']}"
- onmousemove="#{component.attributes['onmousemove']}"
- onblur="#{component.attributes['onblur']}"
- onfocus="#{component.attributes['onfocus']}"
- onmouseover="#{component.attributes['onmouseover']}"
- onmouseout="#{component.attributes['onmouseout']}"
- onkeyup="#{component.attributes['onkeyup']}"
- onkeydown="#{component.attributes['onkeydown']}"
- onkeypress="#{component.attributes['onkeypress']}"
id="#{clientId}Input" disabled="#{disabled}"
name="#{clientId}" type="text" class="rf-au-ft rf-au-i"
/>
- <c:if
test="#{component.attributes['showButton']}">
- <c:if
test="#{component.attributes['disabled']}">
- <div id="#{clientId}Button" class="rf-au-b">
- <div class="rf-au-b-a"></div>
- </div>
- </c:if>
- <c:if
test="#{!component.attributes['disabled']}">
- <div id="#{clientId}Button" class="rf-au-b">
- <div class="rf-au-b-a"></div>
- </div>
- </c:if>
- </c:if>
- </div>
-
- <div onclick="#{component.attributes['onlistclick']}"
- ondblclick="#{component.attributes['onlistdblclick']}"
- onmouseup="#{component.attributes['onlistmouseup']}"
- onmousedown="#{component.attributes['onlistmousedown']}"
- onmousemove="#{component.attributes['onlistmousemove']}"
- onmouseover="#{component.attributes['onlistmouseover']}"
- onmouseout="#{component.attributes['onlistmouseout']}"
- onblur="#{component.attributes['onlistblur']}"
- onfocus="#{component.attributes['onlistfocus']}"
- onkeyup="#{component.attributes['onlistkeyup']}"
- onkeydown="#{component.attributes['onlistkeydown']}"
- onkeypress="#{component.attributes['onlistkeypress']}"
- id="#{clientId}List" class="rf-au-l-c">
-
- <div class="rf-au-shw">
- <div class="rf-au-shw-t"></div>
- <div class="rf-au-shw-l"></div>
- <div class="rf-au-shw-r"></div>
- <div class="rf-au-shw-b"></div>
-
- <div class="rf-au-l-d">
- <div class="rf-au-l-s rf-au-l-w rf-au-l-h">
- <cdk:body>
- <cdk:call
expression="encodeItemsContainer(facesContext, component)"/>
- </cdk:body>
- </div>
- </div>
- </div>
- </div>
- <script type="text/javascript">
- new RichFaces.ui.AutoComplete("#{clientId}",
- "#{clientId}Input", #{getScriptOptions(component)}
- );
- </script>
- </div>
- </cc:implementation>
-
-</cdk:root>
Copied: trunk/ui/input/ui/src/main/templates/autocomplete.template.xml (from rev 18736,
branches/RF-9096/src/main/templates/autocomplete.template.xml)
===================================================================
--- trunk/ui/input/ui/src/main/templates/autocomplete.template.xml
(rev 0)
+++ trunk/ui/input/ui/src/main/templates/autocomplete.template.xml 2010-08-17 19:30:38 UTC
(rev 18737)
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<cdk:root
xmlns="http://richfaces.org/cdk/xhtml-el"
xmlns:cdk="http://richfaces.org/cdk/core"
+
xmlns:c="http://richfaces.org/cdk/jstl/core"
xmlns:cc="http://richfaces.org/cdk/jsf/composite"
+
xmlns:javaee="http://java.sun.com/xml/ns/javaee">
+
+ <cc:interface>
+
<cdk:class>org.richfaces.renderkit.html.AutocompleteRenderer</cdk:class>
+
<cdk:superclass>org.richfaces.renderkit.AutocompleteRendererBase</cdk:superclass>
+ <cdk:component-family>javax.faces.Input</cdk:component-family>
+ <cdk:renderer-type>org.richfaces.AutocompleteRenderer
+ </cdk:renderer-type>
+ <cdk:renders-children>true</cdk:renders-children>
+ </cc:interface>
+
+ <cc:implementation>
+ <cdk:object type="java.lang.Object" name="disabled"
value="#{component.attributes['disabled']}" />
+ <div id="#{clientId}" class="rf-au-f-w rf-au-f">
+ <input id="#{clientId}Value" name="#{clientId}Value"
type="hidden" class="rf-au-ft rf-au-i" />
+ <div style="position : relative; overflow : hidden; text-align :
left; padding-right : 21px;">
+ <input onclick="#{component.attributes['onclick']}"
+ ondblclick="#{component.attributes['ondblclick']}"
+ onmouseup="#{component.attributes['onmouseup']}"
+ onmousedown="#{component.attributes['onmousedown']}"
+ onmousemove="#{component.attributes['onmousemove']}"
+ onblur="#{component.attributes['onblur']}"
+ onfocus="#{component.attributes['onfocus']}"
+ onmouseover="#{component.attributes['onmouseover']}"
+ onmouseout="#{component.attributes['onmouseout']}"
+ onkeyup="#{component.attributes['onkeyup']}"
+ onkeydown="#{component.attributes['onkeydown']}"
+ onkeypress="#{component.attributes['onkeypress']}"
id="#{clientId}Input" disabled="#{disabled}"
name="#{clientId}" type="text" class="rf-au-ft rf-au-i"
/>
+ <c:if
test="#{component.attributes['showButton']}">
+ <c:if
test="#{component.attributes['disabled']}">
+ <div id="#{clientId}Button" class="rf-au-b">
+ <div class="rf-au-b-a"></div>
+ </div>
+ </c:if>
+ <c:if
test="#{!component.attributes['disabled']}">
+ <div id="#{clientId}Button" class="rf-au-b">
+ <div class="rf-au-b-a"></div>
+ </div>
+ </c:if>
+ </c:if>
+ </div>
+
+ <div onclick="#{component.attributes['onlistclick']}"
+ ondblclick="#{component.attributes['onlistdblclick']}"
+ onmouseup="#{component.attributes['onlistmouseup']}"
+ onmousedown="#{component.attributes['onlistmousedown']}"
+ onmousemove="#{component.attributes['onlistmousemove']}"
+ onmouseover="#{component.attributes['onlistmouseover']}"
+ onmouseout="#{component.attributes['onlistmouseout']}"
+ onblur="#{component.attributes['onlistblur']}"
+ onfocus="#{component.attributes['onlistfocus']}"
+ onkeyup="#{component.attributes['onlistkeyup']}"
+ onkeydown="#{component.attributes['onlistkeydown']}"
+ onkeypress="#{component.attributes['onlistkeypress']}"
+ id="#{clientId}List" class="rf-au-l-c">
+
+ <div class="rf-au-shw">
+ <div class="rf-au-shw-t"></div>
+ <div class="rf-au-shw-l"></div>
+ <div class="rf-au-shw-r"></div>
+ <div class="rf-au-shw-b"></div>
+
+ <div class="rf-au-l-d">
+ <div class="rf-au-l-s rf-au-l-w rf-au-l-h">
+ <cdk:body>
+ <cdk:call
expression="encodeItemsContainer(facesContext, component)"/>
+ </cdk:body>
+ </div>
+ </div>
+ </div>
+ </div>
+ <script type="text/javascript">
+ new RichFaces.ui.Autocomplete("#{clientId}",
+ "#{clientId}Input", #{getScriptOptions(component)}
+ );
+ </script>
+ </div>
+ </cc:implementation>
+
+</cdk:root>