dgraham 2002/12/12 18:26:24 Modified: src/share/org/apache/struts/taglib/html FormTag.java Log: Fixed bug with setting focus to a specific index of a field array (radio group). This also fixes the issue with indexed field names. I added the focusIndex attribute which indicates the index in the array to receive focus. Tested on Win2k: Netscape 4.77, Opera 6.05, IE 6.0 See PR #15194 and #1586. Revision Changes Path 1.39 +45 -37 jakarta-struts/src/share/org/apache/struts/taglib/html/FormTag.java Index: FormTag.java =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/FormTag.java,v retrieving revision 1.38 retrieving revision 1.39 diff -u -r1.38 -r1.39 --- FormTag.java 28 Nov 2002 07:13:18 -0000 1.38 +++ FormTag.java 13 Dec 2002 02:26:24 -0000 1.39 @@ -112,6 +112,14 @@ * The name of the field to receive focus, if any. */ protected String focus = null; + + /** + * The index in the focus field array to receive focus. This only applies if the field + * given in the focus attribute is actually an array of fields. This allows a specific + * field in a radio button array to receive focus while still allowing indexed field + * names like "myRadioButtonField[1]" to be passed in the focus attribute. + */ + protected String focusIndex = null; /** * The ActionMapping defining where we will be submitting this form @@ -613,16 +621,7 @@ StringBuffer results = new StringBuffer("</form>"); // Render JavaScript to set the input focus if required - if (focus != null) { - String tempFocus = focus; - StringBuffer refocus = new StringBuffer("["); - if (tempFocus.indexOf("[") > 0) { - StringTokenizer st = new StringTokenizer(tempFocus, "["); - if (st.countTokens() == 2) { - tempFocus = st.nextToken(); - refocus.append(st.nextToken()); - } - } + if (this.focus != null) { results.append("\r\n"); results.append(this.getJsStartElement()); @@ -630,30 +629,21 @@ if (!this.isXhtml()) { results.append(" <!--\r\n"); } - results.append(" if (document.forms[\""); - results.append(beanName); - results.append("\"].elements[\""); - results.append(tempFocus); - results.append("\"]"); - if (refocus.length() > 1) { - results.append(refocus.toString()); - } - results.append(".type != \"hidden\") \r\n"); - - results.append(" var focusControl = document.forms[\""); - results.append(beanName); - results.append("\"].elements[\""); - results.append(tempFocus); - results.append("\"];"); - if (refocus.length() > 1) { - results.append(refocus.toString()); - } - results.append("\r\n"); + + // Construct the control name that will receive focus. + // This does not include any index. + String focusControl = "document.forms[\""+beanName+"\"].elements[\""+this.focus+"\"]"; + + results.append(" var focusControl = " + focusControl+";\r\n\r\n"); + + results.append(" if (focusControl.type != \"hidden\") {\r\n"); - results.append(" if (focusControl.name == null) {\r\n"); - results.append(" focusControl = focusControl[0];\r\n"); - results.append(" }\r\n"); - results.append(" focusControl.focus();\r\n"); + // Construct the index if needed and insert into focus statement + String index = ""; + if(this.focusIndex != null){ + index="["+this.focusIndex+"]"; + } + results.append(" focusControl" + index + ".focus();\r\n } \r\n"); if (!this.isXhtml()) { results.append(" // -->\r\n"); @@ -685,6 +675,7 @@ moduleConfig = null; enctype = null; focus = null; + focusIndex = null; mapping = null; method = null; name = null; @@ -864,4 +855,21 @@ return ("true".equalsIgnoreCase(xhtml)); } + + /** + * Returns the focusIndex. + * @return String + */ + public String getFocusIndex() { + return focusIndex; + } + + /** + * Sets the focusIndex. + * @param focusIndex The focusIndex to set + */ + public void setFocusIndex(String focusIndex) { + this.focusIndex = focusIndex; + } + }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>