Showing
5 changed files
with
300 additions
and
0 deletions
pom.xml
0 → 100644
| 1 | +<?xml version="1.0"?><project> | ||
| 2 | + <parent> | ||
| 3 | + <artifactId>ui</artifactId> | ||
| 4 | + <groupId>org.richfaces.sandbox</groupId> | ||
| 5 | + <version>3.3.3.Final</version> | ||
| 6 | + </parent> | ||
| 7 | + <modelVersion>4.0.0</modelVersion> | ||
| 8 | + <groupId>org.richfaces.sandbox.ui</groupId> | ||
| 9 | + <artifactId>focus</artifactId> | ||
| 10 | + <name>focus</name> | ||
| 11 | + <version>3.3.3.Final</version> | ||
| 12 | + <build> | ||
| 13 | + <plugins> | ||
| 14 | + <plugin> | ||
| 15 | + <groupId>org.richfaces.cdk</groupId> | ||
| 16 | + <artifactId>maven-cdk-plugin</artifactId> | ||
| 17 | + <version>3.3.3.Final</version> | ||
| 18 | + <executions> | ||
| 19 | + <execution> | ||
| 20 | + <phase>generate-sources</phase> | ||
| 21 | + <goals> | ||
| 22 | + <goal>generate</goal> | ||
| 23 | + </goals> | ||
| 24 | + </execution> | ||
| 25 | + </executions> | ||
| 26 | + <configuration> | ||
| 27 | + <library> | ||
| 28 | + <prefix>org.richfaces</prefix> | ||
| 29 | + <taglib> | ||
| 30 | + <shortName>focus</shortName> | ||
| 31 | + </taglib> | ||
| 32 | + </library> | ||
| 33 | + </configuration> | ||
| 34 | + </plugin> | ||
| 35 | + </plugins> | ||
| 36 | + </build> | ||
| 37 | + <dependencies> | ||
| 38 | + <dependency> | ||
| 39 | + <groupId>org.richfaces.framework</groupId> | ||
| 40 | + <artifactId>richfaces-impl</artifactId> | ||
| 41 | + <version>3.3.3.Final</version> | ||
| 42 | + </dependency> | ||
| 43 | + </dependencies> | ||
| 44 | +</project> |
src/main/config/component/focus.xml
0 → 100644
| 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" > | ||
| 3 | +<components> | ||
| 4 | + <component> | ||
| 5 | + <name>org.richfaces.Focus</name> | ||
| 6 | + <family>org.richfaces.Focus</family> | ||
| 7 | + <classname>org.richfaces.component.html.HtmlFocus</classname> | ||
| 8 | + <superclass>org.richfaces.component.UIFocus</superclass> | ||
| 9 | + <description> | ||
| 10 | + <![CDATA[Puts focus on rendered field. In case of text inputs it's | ||
| 11 | + content is selected. If you use it with i.e. radio use suffix | ||
| 12 | + attribute. | ||
| 13 | + ]]> | ||
| 14 | + </description> | ||
| 15 | + <renderer generate="true" override="true"> | ||
| 16 | + <name>org.richfaces.FocusRenderer</name> | ||
| 17 | + <template>focus.jspx</template> | ||
| 18 | + </renderer> | ||
| 19 | + <tag> | ||
| 20 | + <name>focus</name> | ||
| 21 | + <classname>org.richfaces.taglib.FocusTag</classname> | ||
| 22 | + <superclass> | ||
| 23 | + org.ajax4jsf.webapp.taglib.HtmlComponentTagBase | ||
| 24 | + </superclass> | ||
| 25 | + <test> | ||
| 26 | + <classname>org.richfaces.taglib.HtmlFocusTagTest</classname> | ||
| 27 | + <superclassname>org.ajax4jsf.tests.AbstractJspTestCase</superclassname> | ||
| 28 | + </test> | ||
| 29 | + | ||
| 30 | + </tag> | ||
| 31 | + &ui_component_attributes; | ||
| 32 | + <property> | ||
| 33 | + <name>for</name> | ||
| 34 | + <classname>java.lang.String</classname> | ||
| 35 | + <description> | ||
| 36 | + Id of component that should be focused | ||
| 37 | + </description> | ||
| 38 | + <defaultvalue>""</defaultvalue> | ||
| 39 | + </property> | ||
| 40 | + <property> | ||
| 41 | + <name>priority</name> | ||
| 42 | + <classname>java.lang.Integer</classname> | ||
| 43 | + <description> | ||
| 44 | + If there are more components requesting focus, | ||
| 45 | + then component with lowest priority will be focused. | ||
| 46 | + </description> | ||
| 47 | + </property> | ||
| 48 | + <property> | ||
| 49 | + <name>suffix</name> | ||
| 50 | + <classname>java.lang.String</classname> | ||
| 51 | + <description> | ||
| 52 | + Suffix added to clientId. Useful for focusing radio elements. | ||
| 53 | + Example : suffix=":0" puts focus on first radio if target is | ||
| 54 | + radio. | ||
| 55 | + </description> | ||
| 56 | + <defaultvalue>""</defaultvalue> | ||
| 57 | + </property> | ||
| 58 | + </component> | ||
| 59 | +</components> |
| 1 | +package org.richfaces.component; | ||
| 2 | + | ||
| 3 | +import java.util.HashSet; | ||
| 4 | +import java.util.Iterator; | ||
| 5 | +import java.util.Set; | ||
| 6 | +import javax.faces.component.UIComponent; | ||
| 7 | +import javax.faces.component.UIComponentBase; | ||
| 8 | +import javax.faces.component.UIForm; | ||
| 9 | +import javax.faces.component.UIInput; | ||
| 10 | +import javax.faces.context.FacesContext; | ||
| 11 | + | ||
| 12 | +public abstract class UIFocus extends UIComponentBase { | ||
| 13 | + | ||
| 14 | + public static final String COMPONENT_TYPE = "org.richfaces.Focus"; | ||
| 15 | + public static final String COMPONENT_FAMILY = "org.richfaces.Focus"; | ||
| 16 | + | ||
| 17 | + public Integer getDefaultPriority() { | ||
| 18 | + UIComponent parentForm = getParent(); | ||
| 19 | + while (parentForm != null && !(parentForm instanceof UIForm)) { | ||
| 20 | + parentForm = parentForm.getParent(); | ||
| 21 | + } | ||
| 22 | + if (parentForm != null) { | ||
| 23 | + return getUIInputChildrenCount((UIForm) parentForm, getForComponentId()); | ||
| 24 | + } else { | ||
| 25 | + return Integer.MAX_VALUE; | ||
| 26 | + } | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + public String getForComponentId() { | ||
| 30 | + String aFor = getFor(); | ||
| 31 | + | ||
| 32 | + if (aFor != null && !"".equals(aFor)) { | ||
| 33 | + return aFor; | ||
| 34 | + } else { | ||
| 35 | + if (!(getParent() instanceof UIInput)) { | ||
| 36 | + Set<String> allowedClientIds = new HashSet<String>(); | ||
| 37 | + Iterator<String> clientIdsWithMessages = getFacesContext().getClientIdsWithMessages(); | ||
| 38 | + while (clientIdsWithMessages.hasNext()) { | ||
| 39 | + allowedClientIds.add(clientIdsWithMessages.next()); | ||
| 40 | + } | ||
| 41 | + UIComponent component = getFirstInput(getParentForm(this), allowedClientIds); | ||
| 42 | + return component == null ? null : component.getId(); | ||
| 43 | + } else { | ||
| 44 | + return getParent().getId(); | ||
| 45 | + } | ||
| 46 | + } | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + private int getUIInputChildrenCount(UIComponent component, String breakOnId) { | ||
| 50 | + int inputComponentsCount = 0; | ||
| 51 | + for (UIComponent child : component.getChildren()) { | ||
| 52 | + if (child.getId().equals(breakOnId)) { | ||
| 53 | + break; | ||
| 54 | + } | ||
| 55 | + if (child instanceof UIInput) { | ||
| 56 | + inputComponentsCount++; | ||
| 57 | + } else { | ||
| 58 | + int uIInputChildrenCount = getUIInputChildrenCount(child, breakOnId); | ||
| 59 | + inputComponentsCount += uIInputChildrenCount; | ||
| 60 | + } | ||
| 61 | + } | ||
| 62 | + return inputComponentsCount; | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + public abstract String getFor(); | ||
| 66 | + | ||
| 67 | + public abstract void setFor(String value); | ||
| 68 | + | ||
| 69 | + public abstract String getSuffix(); | ||
| 70 | + | ||
| 71 | + public abstract void setSuffix(String value); | ||
| 72 | + | ||
| 73 | + public abstract Integer getPriority(); | ||
| 74 | + | ||
| 75 | + public abstract void setPriority(Integer value); | ||
| 76 | + | ||
| 77 | + private UIComponent getFirstInput(UIComponent parent, Set<String> allowedClientIds) { | ||
| 78 | + UIComponent input = null; | ||
| 79 | + FacesContext facesContext = getFacesContext(); | ||
| 80 | + for (UIComponent child : parent.getChildren()) { | ||
| 81 | + if (child instanceof UIInput && (allowedClientIds.size() == 0 || allowedClientIds.contains(child.getClientId(facesContext)))) { | ||
| 82 | + return child; | ||
| 83 | + } else { | ||
| 84 | + input = getFirstInput(child, allowedClientIds); | ||
| 85 | + if (input != null) { | ||
| 86 | + break; | ||
| 87 | + } | ||
| 88 | + } | ||
| 89 | + } | ||
| 90 | + return input; | ||
| 91 | + } | ||
| 92 | + | ||
| 93 | + private UIForm getParentForm(UIComponent component) { | ||
| 94 | + UIComponent parent = component.getParent(); | ||
| 95 | + if (parent == null) { | ||
| 96 | + return null; | ||
| 97 | + } | ||
| 98 | + if (parent instanceof UIForm) { | ||
| 99 | + return (UIForm) parent; | ||
| 100 | + } else { | ||
| 101 | + return getParentForm(parent); | ||
| 102 | + } | ||
| 103 | + } | ||
| 104 | +} |
| 1 | +if (!window.Richfaces) window.Richfaces = {}; | ||
| 2 | + | ||
| 3 | +Richfaces.FocusManager = (function(){ | ||
| 4 | + | ||
| 5 | + var m_focus; | ||
| 6 | + var m_priority = 999999; | ||
| 7 | + var eventAttached = false; | ||
| 8 | + | ||
| 9 | + var attachEvent = function() { | ||
| 10 | + if(!eventAttached) { | ||
| 11 | + document.observe('dom:loaded',function(){ | ||
| 12 | + var element = $(m_focus); | ||
| 13 | + element.focus(); | ||
| 14 | + element.select(element); | ||
| 15 | + Richfaces.FocusManager.clearFocus(); | ||
| 16 | + }); | ||
| 17 | + } | ||
| 18 | + eventAttached = true; | ||
| 19 | + }; | ||
| 20 | + | ||
| 21 | + return { | ||
| 22 | + getFocus : function() { | ||
| 23 | + return m_focus; | ||
| 24 | + }, | ||
| 25 | + setFocus : function(id,priority) { | ||
| 26 | + if(priority == null) { | ||
| 27 | + priority = 99999; | ||
| 28 | + } | ||
| 29 | + if(m_focus == null || priority < m_priority) { | ||
| 30 | + m_focus = id; | ||
| 31 | + m_priority = priority == null ? 0 : priority; | ||
| 32 | + attachEvent(); | ||
| 33 | + } | ||
| 34 | + }, | ||
| 35 | + clearFocus : function() { | ||
| 36 | + m_focus = null; | ||
| 37 | + m_priority = 999999; | ||
| 38 | + } | ||
| 39 | + }; | ||
| 40 | + })(); |
src/main/templates/focus.jspx
0 → 100644
| 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