Commit ef56792ca01e59ca247a50671301fe2c043345fd

Authored by bernard
1 parent 5422bcfa

Added timing and name attributes to focus component.

1 <?xml version="1.0" encoding="UTF-8"?> 1 <?xml version="1.0" encoding="UTF-8"?>
2 -<!DOCTYPE components PUBLIC "-//AJAX4JSF//CDK Generator config/EN" "http://labs.jboss.com/jbossrichfaces/component-config.dtd" > 2 +<!DOCTYPE components PUBLIC "-//AJAX4JSF//CDK Generator config/EN"
  3 + "http://labs.jboss.com/jbossrichfaces/component-config.dtd" >
3 <components> 4 <components>
4 <component> 5 <component>
5 <name>org.richfaces.Focus</name> 6 <name>org.richfaces.Focus</name>
@@ -12,9 +13,9 @@ @@ -12,9 +13,9 @@
12 attribute. 13 attribute.
13 ]]> 14 ]]>
14 </description> 15 </description>
15 - <renderer generate="true" override="true"> 16 + <renderer generate="false" override="false">
16 <name>org.richfaces.FocusRenderer</name> 17 <name>org.richfaces.FocusRenderer</name>
17 - <template>focus.jspx</template> 18 + <classname>org.richfaces.renderkit.html.HtmlFocusRenderer</classname>
18 </renderer> 19 </renderer>
19 <tag> 20 <tag>
20 <name>focus</name> 21 <name>focus</name>
@@ -26,9 +27,9 @@ @@ -26,9 +27,9 @@
26 <classname>org.richfaces.taglib.HtmlFocusTagTest</classname> 27 <classname>org.richfaces.taglib.HtmlFocusTagTest</classname>
27 <superclassname>org.ajax4jsf.tests.AbstractJspTestCase</superclassname> 28 <superclassname>org.ajax4jsf.tests.AbstractJspTestCase</superclassname>
28 </test> 29 </test>
29 - 30 +
30 </tag> 31 </tag>
31 - &ui_component_attributes; 32 + &ui_component_attributes;
32 <property> 33 <property>
33 <name>for</name> 34 <name>for</name>
34 <classname>java.lang.String</classname> 35 <classname>java.lang.String</classname>
@@ -55,5 +56,24 @@ @@ -55,5 +56,24 @@
55 </description> 56 </description>
56 <defaultvalue>""</defaultvalue> 57 <defaultvalue>""</defaultvalue>
57 </property> 58 </property>
  59 + <property>
  60 + <name>timing</name>
  61 + <classname>java.lang.String</classname>
  62 + <description>
  63 + Moment when focus should be put. The possible values are "onJScall" and "onload".
  64 + If "onJScall" is used then you must manually call Richfaces.FocusManager.focus().
  65 + The default value is "onload".
  66 + </description>
  67 + <defaultvalue>"onload"</defaultvalue>
  68 + </property>
  69 + <property>
  70 + <name>name</name>
  71 + <classname>java.lang.String</classname>
  72 + <description>
  73 + Name of JavaScript function generated to trigger focus. This is required if "timing" attribute
  74 + is set to "onJScall".
  75 + </description>
  76 + <defaultvalue>null</defaultvalue>
  77 + </property>
58 </component> 78 </component>
59 </components> 79 </components>
1 package org.richfaces.component; 1 package org.richfaces.component;
2 2
3 -import java.util.HashSet;  
4 -import java.util.Iterator;  
5 -import java.util.Set;  
6 import javax.faces.component.UIComponent; 3 import javax.faces.component.UIComponent;
7 import javax.faces.component.UIComponentBase; 4 import javax.faces.component.UIComponentBase;
8 import javax.faces.component.UIForm; 5 import javax.faces.component.UIForm;
9 import javax.faces.component.UIInput; 6 import javax.faces.component.UIInput;
10 import javax.faces.context.FacesContext; 7 import javax.faces.context.FacesContext;
  8 +import java.util.HashSet;
  9 +import java.util.Iterator;
  10 +import java.util.Set;
11 11
12 public abstract class UIFocus extends UIComponentBase { 12 public abstract class UIFocus extends UIComponentBase {
13 13
14 public static final String COMPONENT_TYPE = "org.richfaces.Focus"; 14 public static final String COMPONENT_TYPE = "org.richfaces.Focus";
15 public static final String COMPONENT_FAMILY = "org.richfaces.Focus"; 15 public static final String COMPONENT_FAMILY = "org.richfaces.Focus";
  16 + public static final String TIMING_ON_LOAD = "onload";
16 17
17 public Integer getDefaultPriority() { 18 public Integer getDefaultPriority() {
18 UIComponent parentForm = getParent(); 19 UIComponent parentForm = getParent();
@@ -20,7 +21,7 @@ public abstract class UIFocus extends UIComponentBase { @@ -20,7 +21,7 @@ public abstract class UIFocus extends UIComponentBase {
20 parentForm = parentForm.getParent(); 21 parentForm = parentForm.getParent();
21 } 22 }
22 if (parentForm != null) { 23 if (parentForm != null) {
23 - return getUIInputChildrenCount((UIForm) parentForm, getForComponentId()); 24 + return getUIInputChildrenCount(parentForm, getForComponentId());
24 } else { 25 } else {
25 return Integer.MAX_VALUE; 26 return Integer.MAX_VALUE;
26 } 27 }
@@ -74,6 +75,14 @@ public abstract class UIFocus extends UIComponentBase { @@ -74,6 +75,14 @@ public abstract class UIFocus extends UIComponentBase {
74 75
75 public abstract void setPriority(Integer value); 76 public abstract void setPriority(Integer value);
76 77
  78 + public abstract String getTiming();
  79 +
  80 + public abstract String getName();
  81 +
  82 + public abstract void setName(String name);
  83 +
  84 + public abstract void setTiming(String timing);
  85 +
77 private UIComponent getFirstInput(UIComponent parent, Set<String> allowedClientIds) { 86 private UIComponent getFirstInput(UIComponent parent, Set<String> allowedClientIds) {
78 UIComponent input = null; 87 UIComponent input = null;
79 FacesContext facesContext = getFacesContext(); 88 FacesContext facesContext = getFacesContext();
  1 +/*
  2 + * JBoss, Home of Professional Open Source
  3 + * Copyright , Red Hat, Inc. and individual contributors
  4 + * by the @authors tag. See the copyright.txt in the distribution for a
  5 + * full listing of individual contributors.
  6 + *
  7 + * This is free software; you can redistribute it and/or modify it
  8 + * under the terms of the GNU Lesser General Public License as
  9 + * published by the Free Software Foundation; either version 2.1 of
  10 + * the License, or (at your option) any later version.
  11 + *
  12 + * This software is distributed in the hope that it will be useful,
  13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15 + * Lesser General Public License for more details.
  16 + *
  17 + * You should have received a copy of the GNU Lesser General Public
  18 + * License along with this software; if not, write to the Free
  19 + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20 + * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  21 + */
  22 +
  23 +package org.richfaces.renderkit.html;
  24 +
  25 +import org.ajax4jsf.javascript.JSFunction;
  26 +import org.ajax4jsf.javascript.JSFunctionDefinition;
  27 +import org.ajax4jsf.renderkit.HeaderResourcesRendererBase;
  28 +import org.ajax4jsf.renderkit.RendererUtils.HTML;
  29 +import org.ajax4jsf.resource.InternetResource;
  30 +import org.richfaces.component.UIFocus;
  31 +
  32 +import javax.faces.FacesException;
  33 +import javax.faces.component.UIComponent;
  34 +import javax.faces.context.FacesContext;
  35 +import javax.faces.context.ResponseWriter;
  36 +import java.io.IOException;
  37 +
  38 +public class HtmlFocusRenderer extends HeaderResourcesRendererBase {
  39 +// ------------------------------ FIELDS ------------------------------
  40 +
  41 + private final InternetResource[] scripts = {
  42 + getResource("/org/ajax4jsf/javascript/scripts/prototype.js"),
  43 + getResource("/org/richfaces/renderkit/html/scripts/focus.js"),
  44 + };
  45 + private final InternetResource[] styles = {};
  46 +
  47 +// --------------------- GETTER / SETTER METHODS ---------------------
  48 +
  49 + @Override
  50 + protected InternetResource[] getScripts() {
  51 + return scripts;
  52 + }
  53 +
  54 + @Override
  55 + protected InternetResource[] getStyles() {
  56 + return styles;
  57 + }
  58 +
  59 + @Override
  60 + protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent component)
  61 + throws IOException {
  62 + if (!(component instanceof UIFocus)) {
  63 + return;
  64 + }
  65 + UIFocus uiFocus = (UIFocus) component;
  66 + final String clientId = getUtils().clientId(context, component);
  67 + checkValidity(clientId, uiFocus.getName(), uiFocus.getTiming());
  68 + Integer priority = uiFocus.getPriority();
  69 + if (priority == null) {
  70 + priority = uiFocus.getDefaultPriority();
  71 + }
  72 +
  73 + String sid = uiFocus.getForComponentId();
  74 + String target;
  75 + if (sid != null && !"".equals(sid)) {
  76 + try {
  77 + UIComponent forcomp = getUtils().findComponentFor(component, sid);
  78 + if (forcomp != null) {
  79 + target = forcomp.getClientId(context);
  80 + } else {
  81 + target = sid;
  82 + }
  83 + } catch (IllegalArgumentException e) {
  84 + target = sid;
  85 + }
  86 + String suffix = uiFocus.getSuffix();
  87 + if (suffix != null && !"".equals(suffix)) {
  88 + target += suffix;
  89 + }
  90 + } else {
  91 + target = component.getParent().getClientId(context);
  92 + }
  93 +
  94 +
  95 + writer.startElement(HTML.SCRIPT_ELEM, null);
  96 + writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", "type");
  97 + writer.writeAttribute(HTML.id_ATTRIBUTE, clientId, HTML.id_ATTRIBUTE);
  98 + if (UIFocus.TIMING_ON_LOAD.equals(uiFocus.getTiming())) {
  99 + writer.write(new JSFunction("Richfaces.FocusManager.setFocus", target, priority).toScript());
  100 + writer.write(";");
  101 + } else {
  102 + writer.write(new JSFunction("Richfaces.FocusManager.setFocus", target, priority, clientId,
  103 + uiFocus.getTiming()).toScript());
  104 + writer.write(";");
  105 + }
  106 + if (uiFocus.getName() != null && !uiFocus.getName().trim().equals("")) {
  107 + final JSFunctionDefinition definition = new JSFunctionDefinition().addToBody(new JSFunction("Richfaces.FocusManager.focusStored", clientId));
  108 + definition.setName(uiFocus.getName());
  109 + writer.write(definition.toScript());
  110 + writer.write(";");
  111 + }
  112 + writer.endElement(HTML.SCRIPT_ELEM);
  113 + }
  114 +
  115 + private void checkValidity(String clientId, String name, String timing) {
  116 + if ((name == null || "".equals(name.trim())) && "onJScall".equals(timing)) {
  117 + throw new FacesException(
  118 + "The name attribute of the focus component (id='" + clientId + "') must be specified when timing attribute equals to 'onJScall'");
  119 + }
  120 + if (name != null && !"".equals(name.trim()) && !"onJScall".equals(timing)) {
  121 + throw new FacesException(
  122 + "The timing attribute of the focus component (id='" + clientId + "') must be set to 'onJScall' when name attribute is specified");
  123 + }
  124 + }
  125 +
  126 + protected Class<? extends UIComponent> getComponentClass() {
  127 + return UIFocus.class;
  128 + }
  129 +}
@@ -5,13 +5,20 @@ Richfaces.FocusManager = (function() { @@ -5,13 +5,20 @@ Richfaces.FocusManager = (function() {
5 var m_focus; 5 var m_focus;
6 var m_priority = 999999; 6 var m_priority = 999999;
7 var m_domLoaded = false; 7 var m_domLoaded = false;
  8 + var m_timing = false;
  9 + var m_focusStore = {};
  10 + /** Constants */
  11 + var TIMING_ON_JS_CALL = "onJScall";
  12 + var TIMING_ON_LOAD = "onload";
8 13
9 - var focus = function() {  
10 - if (m_focus == null) {  
11 - return;  
12 - } 14 + var focus = function(element) {
13 try { 15 try {
14 - var element = $(m_focus); 16 + if (element == null) {
  17 + if (m_focus == null) {
  18 + return;
  19 + }
  20 + element = $(m_focus);
  21 + }
15 if (element != null) { 22 if (element != null) {
16 element.focus(); 23 element.focus();
17 element.select(element); 24 element.select(element);
@@ -22,22 +29,38 @@ Richfaces.FocusManager = (function() { @@ -22,22 +29,38 @@ Richfaces.FocusManager = (function() {
22 }; 29 };
23 30
24 document.observe('dom:loaded', function() { 31 document.observe('dom:loaded', function() {
25 - focus(); 32 + if (m_timing == TIMING_ON_LOAD) {
  33 + focus(null);
  34 + }
26 m_domLoaded = true; 35 m_domLoaded = true;
27 }); 36 });
28 37
29 return { 38 return {
  39 + focus: focus,
  40 + focusStored: function(focusComponentId) {
  41 + var element = $(m_focusStore[focusComponentId]);
  42 + if (element != null) {
  43 + focus(element);
  44 + }
  45 + },
30 getFocus : function() { 46 getFocus : function() {
31 return m_focus; 47 return m_focus;
32 }, 48 },
33 - setFocus : function(id, priority) { 49 + setFocus : function(id, priority, focusComponentId, timing) {
34 if (priority == null) { 50 if (priority == null) {
35 priority = 99999; 51 priority = 99999;
36 } 52 }
  53 + if (timing != TIMING_ON_JS_CALL) {
  54 + timing = TIMING_ON_LOAD;
  55 + }
  56 + if (focusComponentId != null) {
  57 + m_focusStore[focusComponentId] = id;
  58 + }
37 if (m_focus == null || priority < m_priority) { 59 if (m_focus == null || priority < m_priority) {
38 m_focus = id; 60 m_focus = id;
39 m_priority = priority == null ? 0 : priority; 61 m_priority = priority == null ? 0 : priority;
40 - if (m_domLoaded) { 62 + m_timing = timing;
  63 + if (m_domLoaded && timing == TIMING_ON_LOAD) {
41 focus(); 64 focus();
42 } 65 }
43 } 66 }
@@ -45,6 +68,7 @@ Richfaces.FocusManager = (function() { @@ -45,6 +68,7 @@ Richfaces.FocusManager = (function() {
45 clearFocus : function() { 68 clearFocus : function() {
46 m_focus = null; 69 m_focus = null;
47 m_priority = 999999; 70 m_priority = 999999;
  71 + m_timing = null;
48 } 72 }
49 }; 73 };
50 })(); 74 })();
1 -<?xml version="1.0" encoding="UTF-8"?>  
2 -<f:root  
3 - xmlns:f="http://jsf.exadel.com/template"  
4 - xmlns:vcp=" http://jsf.exadel.com/vcp"  
5 - xmlns:ui=" http://jsf.exadel.com/ui"  
6 - xmlns:x=" http://jsf.exadel.com/vcp"  
7 - xmlns:u="http://jsf.exadel.com/util"  
8 - xmlns:h="http://jsf.exadel.com/header"  
9 - component="org.richfaces.component.UIFocus"  
10 - baseclass="org.ajax4jsf.renderkit.HeaderResourcesRendererBase"  
11 - class="org.richfaces.renderkit.html.FocusRenderer">  
12 -  
13 - <f:clientid var="clientId"/>  
14 - <c:set var="for" value="#{component.forComponentId}"/>  
15 - <c:set var="priority" value="#{component.attributes['priority']}"/>  
16 - <h:scripts>new org.ajax4jsf.javascript.PrototypeScript(),/org/richfaces/renderkit/html/scripts/focus.js</h:scripts>  
17 -  
18 - <jsp:scriptlet>  
19 -<![CDATA[  
20 - Integer priority = (Integer)variables.getVariable("priority");  
21 - if(priority == null) {  
22 - priority = component.getDefaultPriority();  
23 - }  
24 -  
25 - variables.setVariable("priority",priority);  
26 - String sid = (String) variables.getVariable("for");  
27 - String target;  
28 - if (sid != null && ! "".equals(sid)) {  
29 - try {  
30 - UIComponent forcomp = getUtils().findComponentFor((UIComponent)component,sid);  
31 - if (forcomp != null) {  
32 - target = forcomp.getClientId(context);  
33 - } else {  
34 - target = sid;  
35 - }  
36 - }catch(IllegalArgumentException e) {  
37 - target = sid;  
38 - }  
39 - String suffix = component.getSuffix();  
40 - if(suffix != null && !"".equals(suffix)) {  
41 - target += suffix;  
42 - }  
43 - } else {  
44 - target = component.getParent().getClientId(context);  
45 - }  
46 - variables.setVariable("for",target);  
47 -]]>  
48 - </jsp:scriptlet>  
49 -  
50 - <script type="text/javascript">  
51 - Richfaces.FocusManager.setFocus("#{for}",#{priority});  
52 - </script>  
53 -</f:root>  
Please register or login to post a comment