Commit 4fce3effa36d4e80dc17cd673fa66f597585cf4f

Authored by bernard
0 parents

Focus initial import

  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>
... ...
  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 + })();
... ...
  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