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