Thanks! It is fixed now... Bruno
2005/9/15, Paul Klaer <[EMAIL PROTECTED]>: > Done. :-) > > http://issues.apache.org/jira/browse/MYFACES-569 > > Bruno Aranda wrote: > > Thanks Paul, but could you please open a JIRA issue with the problem > > and upload the patch there? Then this will be tested :-) We have to > > keep the bugs under control... > > > > Regards, > > > > Bruno > > > > 2005/9/15, Paul Klaer <[EMAIL PROTECTED]>: > > > >>Hi, > >> > >>this is definitly a bug. So, here I provide the solution. Can someone > >>test and commit the files please? > >> > >>I saw the mail in the dev list from Zhong Li: > >>--------------- > >>"I found how it happened. I have onload on body tag, even with simplest > >>one, something like, <body onload="alert('loading');"> > >>... > >>Then the inputCalendar doesn't work, can't popup. so weired. " > >>--------------- > >> > >>Since he had the same problem I checked the JavaScript behaviour in > >>Firefox and debugged a little bit... > >> > >>This problem occures because the old JavaScript is executed in Firefox > >>before the body tag "onload" is set during the render phase. > >>So this variable "var jscalendarOnloadBackup = window.onload;" is only > >>set to "undefined" and never with the old onload script. > >> > >>To solve this problem I rewrote the load script as a function in the > >>"popcalendar.js" and this function is then called just before > >>"jscalendarSetImageDirectory" is called inside the enclosing "body" > >>element. At this time the "onload" tag of the "body" element is set. > >> > >>You can test this if you change the "<body>" element to "<body > >>onload="alert('test body onload');">" of the "simple/calendar.jsp" example.. > >> > >>Regards, > >> > >>Paul > >> > >> > >>Paul Klaer wrote: > >> > >>>Thank you for your tipps and sorry for my late answer. I had much to do > >>>and wanted to check the code before I write something back. > >>>In the meantime we got a new CSS file and the calendar popups are > >>>working fine in IE after resetting some div... > >>> > >>>The examples out of the myfaces repository are working on both: Firefox > >>>and IE. There I had no problem with the js script. > >>> > >>>I think we have to be careful using css... > >>> > >>>But, I have now a problem with Firefox popups to display them and this > >>>is because we use the "onload" tag and some own javascript init > >>>functions for the page. > >>>Now I checked the "popcalendar.js" code and the function > >>>jscalendarInit() is only called if there is no "window.onload" (onload > >>>tag) in the browser specified if no IE is used. This is why the variable > >>>"jscalendarBPageLoaded" still remains with the default value "false" and > >>>Firefox never executes this: > >>> > >>>--------- > >>>function jscalendarPopUpCalendar(ctl, ctl2, format){ > >>> if (jscalendarBPageLoaded){ > >>> .... > >>>--------- > >>> > >>>Is this right that I can't use the onload tag using Firefox? > >>> > >>> > >>>Martin Marinschek wrote: > >>> > >>> > >>>>this occurs with IE only, right? > >>>> > >>>>it's a known bug of the IE - you would need to go through the elements > >>>>of the form and render them invisible while displaying the > >>>>inputCalendar. > >>>> > >>>>If you prepare a patch for the javaScript of inputCalendar which works > >>>>in IE and Firefox we would happily apply it! > >>>> > >>>>regards, > >>>> > >>>>Martin > >>>> > >>>>On 9/9/05, Paul Klaer <[EMAIL PROTECTED]> wrote: > >>>> > >>>> > >>>>>Hi, > >>>>> > >>>>>I have a problem using the inputCalendar component. The popup window is > >>>>>shown correctly and works fine but if there are some buttons on my form > >>>>>the popup window is hidden by the buttons. The popup just appears in the > >>>>>background. > >>>>>How can I solve this problem? Using css and the z-index for the buttons > >>>>>option doesn't solve the problem. How can I set the calendar popup > >>>>>component to the foreground? > >>>>>Is it a bug of the inputCalendar component? > >>>>> > >>>>>Paul > >>>>> > >>>> > >>>> > >>>> > >> > >> > >>/* > >> * Copyright 2004 The Apache Software Foundation. > >> * > >> * Licensed under the Apache License, Version 2.0 (the "License"); > >> * you may not use this file except in compliance with the License. > >> * You may obtain a copy of the License at > >> * > >> * http://www.apache.org/licenses/LICENSE-2.0 > >> * > >> * Unless required by applicable law or agreed to in writing, software > >> * distributed under the License is distributed on an "AS IS" BASIS, > >> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > >> * See the License for the specific language governing permissions and > >> * limitations under the License. > >> */ > >>package org.apache.myfaces.custom.calendar; > >> > >>import org.apache.myfaces.component.html.ext.HtmlInputText; > >>import org.apache.myfaces.component.html.util.AddResource; > >>import org.apache.myfaces.renderkit.JSFAttr; > >>import org.apache.myfaces.renderkit.RendererUtils; > >>import org.apache.myfaces.renderkit.html.HTML; > >>import org.apache.myfaces.renderkit.html.HtmlRenderer; > >>import org.apache.myfaces.renderkit.html.HtmlRendererUtils; > >>import org.apache.myfaces.renderkit.html.util.JavascriptUtils; > >> > >>import javax.faces.application.Application; > >>import javax.faces.component.UIComponent; > >>import javax.faces.component.UIInput; > >>import javax.faces.component.UIParameter; > >>import javax.faces.component.html.HtmlCommandLink; > >>import javax.faces.component.html.HtmlOutputText; > >>import javax.faces.context.FacesContext; > >>import javax.faces.context.ResponseWriter; > >>import javax.faces.convert.Converter; > >>import javax.faces.convert.ConverterException; > >>import java.io.IOException; > >>import java.text.DateFormat; > >>import java.text.DateFormatSymbols; > >>import java.text.ParseException; > >>import java.text.SimpleDateFormat; > >>import java.util.Calendar; > >>import java.util.Date; > >>import java.util.Locale; > >>import java.util.List; > >> > >>/** > >> * @author Martin Marinschek (latest modification by $Author: svieujot $) > >> * @version $Revision: 239482 $ $Date: 2005-08-24 01:34:01 +0200 (Mi, 24 > >> Aug 2005) $ > >> */ > >>public class HtmlCalendarRenderer > >> extends HtmlRenderer > >>{ > >> private static final String JAVASCRIPT_ENCODED = > >> "org.apache.myfaces.calendar.JAVASCRIPT_ENCODED"; > >> > >> //private static Log log = > >> LogFactory.getLog(HtmlCalendarRenderer.class); > >> > >> public void encodeEnd(FacesContext facesContext, UIComponent component) > >> throws IOException > >> { > >> RendererUtils.checkParamValidity(facesContext, component, > >> HtmlInputCalendar.class); > >> > >> HtmlInputCalendar inputCalendar = (HtmlInputCalendar) component; > >> > >> Locale currentLocale = facesContext.getViewRoot().getLocale(); > >> > >> > >> Date value; > >> > >> try > >> { > >> // value = RendererUtils.getDateValue(inputCalendar); > >> Converter converter = getConverter(inputCalendar); > >> if (converter instanceof DateConverter) > >> { > >> value = ((DateConverter) converter).getAsDate(facesContext, > >> component); > >> } > >> else > >> { > >> value = RendererUtils.getDateValue(inputCalendar); > >> } > >> } > >> catch (IllegalArgumentException illegalArgumentException) > >> { > >> value = null; > >> } > >> > >> > >> Calendar timeKeeper = Calendar.getInstance(currentLocale); > >> timeKeeper.setTime(value!=null?value:new Date()); > >> > >> DateFormatSymbols symbols = new DateFormatSymbols(currentLocale); > >> > >> String[] weekdays = mapWeekdays(symbols); > >> String[] months = mapMonths(symbols); > >> > >> if(inputCalendar.isRenderAsPopup()) > >> { > >> if(inputCalendar.isAddResources()) > >> addScriptAndCSSResources(facesContext, component); > >> > >> String dateFormat = > >> CalendarDateTimeConverter.createJSPopupFormat(facesContext, > >> inputCalendar.getPopupDateFormat()); > >> > >> Application application = facesContext.getApplication(); > >> > >> HtmlInputText inputText = null; > >> > >> List li = inputCalendar.getChildren(); > >> > >> for (int i = 0; i < li.size(); i++) > >> { > >> UIComponent uiComponent = (UIComponent) li.get(i); > >> > >> if(uiComponent instanceof HtmlInputText) > >> { > >> inputText = (HtmlInputText) uiComponent; > >> break; > >> } > >> } > >> > >> if(inputText == null) > >> { > >> inputText = (HtmlInputText) > >> application.createComponent(HtmlInputText.COMPONENT_TYPE); > >> } > >> > >> RendererUtils.copyHtmlInputTextAttributes(inputCalendar, > >> inputText); > >> > >> inputText.setConverter(null); // value for this transient > >> component will already be converted > >> inputText.setTransient(true); > >> > >> if (value == null && inputCalendar.getSubmittedValue() != null) > >> { > >> inputText.setValue(inputCalendar.getSubmittedValue()); > >> } > >> else > >> { > >> inputText.setValue(getConverter(inputCalendar).getAsString( > >> facesContext,inputCalendar,value)); > >> } > >> inputText.setDisabled(inputCalendar.isDisabled()); > >> inputText.setReadonly(inputCalendar.isReadonly()); > >> > >> inputText.setEnabledOnUserRole(inputCalendar.getEnabledOnUserRole()); > >> > >> inputText.setVisibleOnUserRole(inputCalendar.getVisibleOnUserRole()); > >> > >> //This is where two components with the same id are in the tree, > >> //so make sure that during the rendering the id is unique. > >> > >> inputCalendar.setId(inputCalendar.getId()+"tempId"); > >> > >> inputCalendar.getChildren().add(inputText); > >> > >> RendererUtils.renderChild(facesContext, inputText); > >> > >> inputCalendar.getChildren().remove(inputText); > >> > >> //Set back the correct id to the input calendar > >> inputCalendar.setId(inputText.getId()); > >> > >> if (!inputCalendar.isDisabled()) > >> { > >> ResponseWriter writer = > >> facesContext.getResponseWriter(); > >> > >> writer.startElement(HTML.SCRIPT_ELEM, component); > >> > >> writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR,HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT,null); > >> writer.write("<!--\n"); > >> writer.writeText(getLocalizedLanguageScript(symbols, > >> months, > >> > >> timeKeeper.getFirstDayOfWeek(),inputCalendar),null); > >> writeScriptBtn(facesContext, inputCalendar, > >> dateFormat,inputCalendar.getPopupButtonString()); > >> writer.write("\n-->"); > >> writer.endElement(HTML.SCRIPT_ELEM); > >> > >> /* writer.startElement(HTML.INPUT_ELEM,null); > >> > >> writer.writeAttribute(HTML.TYPE_ATTR,HTML.INPUT_TYPE_BUTTON,null); > >> > >> writer.writeAttribute(HTML.ONCLICK_ATTR,"popUpCalendar(this, > >> "+inputText.getClientId(facesContext)+ > >> ", \\\"dd.mm.yyyy\\\")",null); > >> writer.endElement(HTML.INPUT_TYPE_BUTTON);*/ > >> } > >> } > >> else > >> { > >> > >> int lastDayInMonth = > >> timeKeeper.getActualMaximum(Calendar.DAY_OF_MONTH); > >> > >> int currentDay = timeKeeper.get(Calendar.DAY_OF_MONTH); > >> > >> if (currentDay > lastDayInMonth) > >> currentDay = lastDayInMonth; > >> > >> timeKeeper.set(Calendar.DAY_OF_MONTH, 1); > >> > >> int weekDayOfFirstDayOfMonth = > >> mapCalendarDayToCommonDay(timeKeeper.get(Calendar.DAY_OF_WEEK)); > >> > >> int weekStartsAtDayIndex = > >> mapCalendarDayToCommonDay(timeKeeper.getFirstDayOfWeek()); > >> > >> ResponseWriter writer = facesContext.getResponseWriter(); > >> > >> HtmlRendererUtils.writePrettyLineSeparator(facesContext); > >> HtmlRendererUtils.writePrettyLineSeparator(facesContext); > >> > >> writer.startElement(HTML.TABLE_ELEM, component); > >> HtmlRendererUtils.renderHTMLAttributes(writer, component, > >> HTML.UNIVERSAL_ATTRIBUTES); > >> HtmlRendererUtils.renderHTMLAttributes(writer, component, > >> HTML.EVENT_HANDLER_ATTRIBUTES); > >> writer.flush(); > >> > >> HtmlRendererUtils.writePrettyLineSeparator(facesContext); > >> > >> writer.startElement(HTML.TR_ELEM, component); > >> > >> if(inputCalendar.getMonthYearRowClass() != null) > >> writer.writeAttribute(HTML.CLASS_ATTR, > >> inputCalendar.getMonthYearRowClass(), null); > >> > >> writeMonthYearHeader(facesContext, writer, inputCalendar, > >> timeKeeper, > >> currentDay, weekdays, months); > >> > >> writer.endElement(HTML.TR_ELEM); > >> > >> HtmlRendererUtils.writePrettyLineSeparator(facesContext); > >> > >> writer.startElement(HTML.TR_ELEM, component); > >> > >> if(inputCalendar.getWeekRowClass() != null) > >> writer.writeAttribute(HTML.CLASS_ATTR, > >> inputCalendar.getWeekRowClass(), null); > >> > >> writeWeekDayNameHeader(weekStartsAtDayIndex, weekdays, > >> facesContext, writer, inputCalendar); > >> > >> writer.endElement(HTML.TR_ELEM); > >> > >> HtmlRendererUtils.writePrettyLineSeparator(facesContext); > >> > >> writeDays(facesContext, writer, inputCalendar, timeKeeper, > >> currentDay, weekStartsAtDayIndex, > >> weekDayOfFirstDayOfMonth, > >> lastDayInMonth, weekdays); > >> > >> writer.endElement(HTML.TABLE_ELEM); > >> } > >> } > >> > >> /** > >> * Used by the x:inputDate renderer : HTMLDateRenderer > >> * @throws IOException > >> */ > >> static public void addScriptAndCSSResources(FacesContext facesContext, > >> UIComponent component) throws IOException{ > >> // check to see if javascript has already been written (which could > >> happen if more than one calendar on the same page) > >> if > >> (facesContext.getExternalContext().getRequestMap().containsKey(JAVASCRIPT_ENCODED)) > >> { > >> return; > >> } > >> > >> // Add the javascript and CSS pages > >> AddResource.addStyleSheet(HtmlCalendarRenderer.class, > >> "WH/theme.css", facesContext); > >> AddResource.addStyleSheet(HtmlCalendarRenderer.class, > >> "DB/theme.css", facesContext); > >> AddResource.addJavaScriptToHeader(HtmlCalendarRenderer.class, > >> "popcalendar.js", facesContext); > >> > >> ResponseWriter writer = facesContext.getResponseWriter(); > >> > >> writer.startElement(HTML.SCRIPT_ELEM, component); > >> writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR, > >> HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null); > >> writer.write( > >> "loadPopupScript();jscalendarSetImageDirectory(\"" > >> +JavascriptUtils.encodeString( > >> > >> AddResource.getResourceMappedPath(HtmlCalendarRenderer.class, "DB/", > >> facesContext) > >> ) > >> +"\")"); > >> writer.endElement(HTML.SCRIPT_ELEM); > >> > >> > >> facesContext.getExternalContext().getRequestMap().put(JAVASCRIPT_ENCODED, > >> Boolean.TRUE); > >> } > >> > >> public static String getLocalizedLanguageScript(DateFormatSymbols > >> symbols, > >> String[] months, int firstDayOfWeek, HtmlInputCalendar > >> inputCalendar) > >> { > >> int realFirstDayOfWeek = firstDayOfWeek-1/*Java has different > >> starting-point*/; > >> > >> String[] weekDays; > >> > >> if(realFirstDayOfWeek==0) > >> { > >> weekDays = mapWeekdaysStartingWithSunday(symbols); > >> } > >> else if(realFirstDayOfWeek==1) > >> { > >> weekDays = mapWeekdays(symbols); > >> } > >> else > >> throw new IllegalStateException("Week may only start with > >> sunday or monday."); > >> > >> StringBuffer script = new StringBuffer(); > >> defineStringArray(script, "jscalendarMonthName", months); > >> defineStringArray(script, "jscalendarDayName", weekDays); > >> setIntegerVariable(script, "jscalendarStartAt",realFirstDayOfWeek); > >> > >> if( inputCalendar != null ){ // To allow null parameter for > >> inputDate tag. > >> if(inputCalendar.getPopupGotoString()!=null) > >> setStringVariable(script, > >> "jscalendarGotoString",inputCalendar.getPopupGotoString()); > >> if(inputCalendar.getPopupTodayString()!=null) > >> setStringVariable(script, > >> "jscalendarTodayString",inputCalendar.getPopupTodayString()); > >> if(inputCalendar.getPopupWeekString()!=null) > >> setStringVariable(script, > >> "jscalendarWeekString",inputCalendar.getPopupWeekString()); > >> if(inputCalendar.getPopupScrollLeftMessage()!=null) > >> setStringVariable(script, > >> "jscalendarScrollLeftMessage",inputCalendar.getPopupScrollLeftMessage()); > >> if(inputCalendar.getPopupScrollRightMessage()!=null) > >> setStringVariable(script, > >> "jscalendarScrollRightMessage",inputCalendar.getPopupScrollRightMessage()); > >> if(inputCalendar.getPopupSelectMonthMessage()!=null) > >> setStringVariable(script, > >> "jscalendarSelectMonthMessage",inputCalendar.getPopupSelectMonthMessage()); > >> if(inputCalendar.getPopupSelectYearMessage()!=null) > >> setStringVariable(script, > >> "jscalendarSelectYearMessage",inputCalendar.getPopupSelectYearMessage()); > >> if(inputCalendar.getPopupSelectDateMessage()!=null) > >> setStringVariable(script, > >> "jscalendarSelectDateMessage",inputCalendar.getPopupSelectDateMessage()); > >> } > >> > >> return script.toString(); > >> } > >> > >> private static void setIntegerVariable(StringBuffer script, String > >> name, int value) > >> { > >> script.append(name); > >> script.append(" = "); > >> script.append(value); > >> script.append(";\n"); > >> } > >> > >> private static void setStringVariable(StringBuffer script, String name, > >> String value) > >> { > >> script.append(name); > >> script.append(" = \""); > >> script.append(value); > >> script.append("\";\n"); > >> } > >> > >> private static void defineStringArray(StringBuffer script, String > >> arrayName, String[] array) > >> { > >> script.append(arrayName); > >> script.append(" = new Array("); > >> > >> for(int i=0;i<array.length;i++) > >> { > >> if(i!=0) > >> script.append(","); > >> > >> script.append("\""); > >> script.append(array[i]); > >> script.append("\""); > >> } > >> > >> script.append(");"); > >> } > >> > >> private void writeScriptBtn(FacesContext facesContext, UIComponent > >> uiComponent, String dateFormat, String popupButtonString) > >> throws IOException > >> { > >> ResponseWriter writer = facesContext.getResponseWriter(); > >> > >> HtmlInputCalendar calendar = (HtmlInputCalendar)uiComponent; > >> boolean renderButtonAsImage = calendar.isRenderPopupButtonAsImage(); > >> > >> writer.write("if (!document.layers) {\n"); > >> writer.write("document.write('"); > >> > >> if (!renderButtonAsImage) { > >> // render the button > >> writer.startElement(HTML.INPUT_ELEM, uiComponent); > >> writer.writeAttribute(HTML.TYPE_ATTR, HTML.INPUT_TYPE_BUTTON, > >> null); > >> > >> > >> writeOnclickJsCalendarFunctionCall(facesContext,uiComponent,dateFormat); > >> > >> if(popupButtonString==null) > >> popupButtonString="..."; > >> writer.writeAttribute(HTML.VALUE_ATTR, popupButtonString, null); > >> /* > >> if (renderButtonAsImage) { > >> writer.writeAttribute(HTML.ID_ATTR, buttonId, null); > >> writer.writeAttribute(HTML.NAME_ATTR, buttonId, null); > >> writer.writeAttribute(HTML.STYLE_ATTR, > >> "visibility:hidden;",null); > >> } else { > >> HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, > >> HTML.UNIVERSAL_ATTRIBUTES); > >> } > >> */ > >> writer.endElement(HTML.INPUT_ELEM); > >> } else { > >> // render the image > >> writer.startElement(HTML.IMG_ELEM, uiComponent); > >> writer.writeAttribute(HTML.SRC_ATTR, > >> AddResource.getResourceMappedPath(HtmlCalendarRenderer.class, > >> "images/calendar.gif", facesContext), null); > >> writer.writeAttribute(HTML.STYLE_ATTR, > >> "vertical-align:bottom;", null); > >> > >> //writer.writeAttribute(HTML.ONCLICK_ATTR, > >> "document.getElementById(\\'"+buttonId+"\\').click()",null); > >> > >> writeOnclickJsCalendarFunctionCall(facesContext,uiComponent,dateFormat); > >> //writer.writeAttribute(HTML.ONMOUSEOVER_ATTR, > >> "this.style.cursor=\\'hand\\';", null); > >> //writer.writeAttribute(HTML.ONMOUSEOUT_ATTR, > >> "this.style.cursor=\\'default\\';", null); > >> > >> writer.endElement(HTML.IMG_ELEM); > >> } > >> > >> writer.write("');"); > >> writer.write("\n}"); > >> } > >> > >> private void writeOnclickJsCalendarFunctionCall(FacesContext > >> facesContext, UIComponent uiComponent, String dateFormat) > >> throws IOException > >> { > >> String clientId = uiComponent.getClientId(facesContext); > >> > >> ResponseWriter writer = facesContext.getResponseWriter(); > >> > >> String jsCalendarFunctionCall = > >> "jscalendarPopUpCalendar(this,document.getElementById(\\'"+clientId+"\\'),\\'"+dateFormat+"\\')"; > >> writer.writeAttribute(HTML.ONCLICK_ATTR, jsCalendarFunctionCall, > >> null); > >> } > >> > >> > >> private void writeMonthYearHeader(FacesContext facesContext, > >> ResponseWriter writer, UIInput inputComponent, Calendar timeKeeper, > >> int currentDay, String[] weekdays, > >> String[] months) > >> throws IOException > >> { > >> Calendar cal = shiftMonth(facesContext, timeKeeper, currentDay, -1); > >> > >> writeCell(facesContext, writer, inputComponent, "<", cal.getTime(), > >> null); > >> > >> writer.startElement(HTML.TD_ELEM, inputComponent); > >> writer.writeAttribute(HTML.COLSPAN_ATTR, new > >> Integer(weekdays.length - 2), null); > >> writer.writeText(months[timeKeeper.get(Calendar.MONTH)] + " " + > >> timeKeeper.get(Calendar.YEAR), null); > >> writer.endElement(HTML.TD_ELEM); > >> > >> cal = shiftMonth(facesContext, timeKeeper, currentDay, 1); > >> > >> writeCell(facesContext, writer, inputComponent, ">", cal.getTime(), > >> null); > >> } > >> > >> private Calendar shiftMonth(FacesContext facesContext, > >> Calendar timeKeeper, int currentDay, int > >> shift) > >> { > >> Calendar cal = copyCalendar(facesContext, timeKeeper); > >> > >> cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + shift); > >> > >> if(currentDay > cal.getActualMaximum(Calendar.DAY_OF_MONTH)) > >> currentDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); > >> > >> cal.set(Calendar.DAY_OF_MONTH, currentDay); > >> return cal; > >> } > >> > >> private Calendar copyCalendar(FacesContext facesContext, Calendar > >> timeKeeper) > >> { > >> Calendar cal = > >> Calendar.getInstance(facesContext.getViewRoot().getLocale()); > >> cal.set(Calendar.YEAR, timeKeeper.get(Calendar.YEAR)); > >> cal.set(Calendar.MONTH, timeKeeper.get(Calendar.MONTH)); > >> cal.set(Calendar.HOUR_OF_DAY, timeKeeper.get(Calendar.HOUR_OF_DAY)); > >> cal.set(Calendar.MINUTE, timeKeeper.get(Calendar.MINUTE)); > >> cal.set(Calendar.SECOND, timeKeeper.get(Calendar.SECOND)); > >> cal.set(Calendar.MILLISECOND, timeKeeper.get(Calendar.MILLISECOND)); > >> return cal; > >> } > >> > >> private void writeWeekDayNameHeader(int weekStartsAtDayIndex, String[] > >> weekdays, FacesContext facesContext, ResponseWriter writer, UIInput > >> inputComponent) > >> throws IOException > >> { > >> for (int i = weekStartsAtDayIndex; i < weekdays.length; i++) > >> writeCell(facesContext, > >> writer, inputComponent, weekdays[i], null, null); > >> > >> for (int i = 0; i < weekStartsAtDayIndex; i++) > >> writeCell(facesContext, writer, > >> inputComponent, weekdays[i], null, null); > >> } > >> > >> private void writeDays(FacesContext facesContext, ResponseWriter writer, > >> HtmlInputCalendar inputComponent, Calendar > >> timeKeeper, int currentDay, int weekStartsAtDayIndex, > >> int weekDayOfFirstDayOfMonth, int > >> lastDayInMonth, String[] weekdays) > >> throws IOException > >> { > >> Calendar cal; > >> > >> int space = (weekStartsAtDayIndex < weekDayOfFirstDayOfMonth) ? > >> (weekDayOfFirstDayOfMonth - weekStartsAtDayIndex) > >> : (weekdays.length - weekStartsAtDayIndex + > >> weekDayOfFirstDayOfMonth); > >> > >> if (space == weekdays.length) > >> space = 0; > >> > >> int columnIndexCounter = 0; > >> > >> for (int i = 0; i < space; i++) > >> { > >> if (columnIndexCounter == 0) > >> { > >> writer.startElement(HTML.TR_ELEM, inputComponent); > >> } > >> > >> writeCell(facesContext, writer, inputComponent, "", > >> null, inputComponent.getDayCellClass()); > >> columnIndexCounter++; > >> } > >> > >> for (int i = 0; i < lastDayInMonth; i++) > >> { > >> if (columnIndexCounter == 0) > >> { > >> writer.startElement(HTML.TR_ELEM, inputComponent); > >> } > >> > >> cal = copyCalendar(facesContext, timeKeeper); > >> cal.set(Calendar.DAY_OF_MONTH, i + 1); > >> > >> String cellStyle = inputComponent.getDayCellClass(); > >> > >> if((currentDay - 1) == i) > >> cellStyle = inputComponent.getCurrentDayCellClass(); > >> > >> writeCell(facesContext, writer, > >> inputComponent, String.valueOf(i + 1), cal.getTime(), > >> cellStyle); > >> > >> columnIndexCounter++; > >> > >> if (columnIndexCounter == weekdays.length) > >> { > >> writer.endElement(HTML.TR_ELEM); > >> HtmlRendererUtils.writePrettyLineSeparator(facesContext); > >> columnIndexCounter = 0; > >> } > >> } > >> > >> if (columnIndexCounter != 0) > >> { > >> for (int i = columnIndexCounter; i < weekdays.length; i++) > >> { > >> writeCell(facesContext, writer, > >> inputComponent, "", null, > >> inputComponent.getDayCellClass()); > >> } > >> > >> writer.endElement(HTML.TR_ELEM); > >> HtmlRendererUtils.writePrettyLineSeparator(facesContext); > >> } > >> } > >> > >> private void writeCell(FacesContext facesContext, > >> ResponseWriter writer, UIInput component, String > >> content, > >> Date valueForLink, String styleClass) > >> throws IOException > >> { > >> writer.startElement(HTML.TD_ELEM, component); > >> > >> if (styleClass != null) > >> writer.writeAttribute(HTML.CLASS_ATTR, styleClass, null); > >> > >> if (valueForLink == null) > >> writer.writeText(content, JSFAttr.VALUE_ATTR); > >> else > >> { > >> writeLink(content, component, facesContext, valueForLink); > >> } > >> > >> writer.endElement(HTML.TD_ELEM); > >> } > >> > >> private void writeLink(String content, > >> UIInput component, > >> FacesContext facesContext, > >> Date valueForLink) > >> throws IOException > >> { > >> Converter converter = getConverter(component); > >> > >> Application application = facesContext.getApplication(); > >> HtmlCommandLink link > >> = > >> (HtmlCommandLink)application.createComponent(HtmlCommandLink.COMPONENT_TYPE); > >> link.setId(component.getId() + "_" + valueForLink.getTime() + > >> "_link"); > >> link.setTransient(true); > >> link.setImmediate(component.isImmediate()); > >> > >> HtmlOutputText text > >> = > >> (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE); > >> text.setValue(content); > >> text.setId(component.getId() + "_" + valueForLink.getTime() + > >> "_text"); > >> text.setTransient(true); > >> > >> UIParameter parameter > >> = > >> (UIParameter)application.createComponent(UIParameter.COMPONENT_TYPE); > >> parameter.setId(component.getId() + "_" + valueForLink.getTime() + > >> "_param"); > >> parameter.setTransient(true); > >> parameter.setName(component.getClientId(facesContext)); > >> parameter.setValue(converter.getAsString(facesContext, component, > >> valueForLink)); > >> > >> HtmlInputCalendar calendar = (HtmlInputCalendar)component; > >> if (calendar.isDisabled() || calendar.isReadonly()) > >> { > >> component.getChildren().add(text); > >> > >> RendererUtils.renderChild(facesContext, text); > >> } > >> else > >> { > >> component.getChildren().add(link); > >> link.getChildren().add(parameter); > >> link.getChildren().add(text); > >> > >> RendererUtils.renderChild(facesContext, link); > >> } > >> } > >> > >> private Converter getConverter(UIInput component) > >> { > >> Converter converter = component.getConverter(); > >> > >> if (converter == null) > >> { > >> converter = new CalendarDateTimeConverter(); > >> } > >> return converter; > >> } > >> > >> private int mapCalendarDayToCommonDay(int day) > >> { > >> switch (day) > >> { > >> case Calendar.TUESDAY: > >> return 1; > >> case Calendar.WEDNESDAY: > >> return 2; > >> case Calendar.THURSDAY: > >> return 3; > >> case Calendar.FRIDAY: > >> return 4; > >> case Calendar.SATURDAY: > >> return 5; > >> case Calendar.SUNDAY: > >> return 6; > >> default: > >> return 0; > >> } > >> } > >> > >> private static String[] mapWeekdays(DateFormatSymbols symbols) > >> { > >> String[] weekdays = new String[7]; > >> > >> String[] localeWeekdays = symbols.getShortWeekdays(); > >> > >> weekdays[0] = localeWeekdays[Calendar.MONDAY]; > >> weekdays[1] = localeWeekdays[Calendar.TUESDAY]; > >> weekdays[2] = localeWeekdays[Calendar.WEDNESDAY]; > >> weekdays[3] = localeWeekdays[Calendar.THURSDAY]; > >> weekdays[4] = localeWeekdays[Calendar.FRIDAY]; > >> weekdays[5] = localeWeekdays[Calendar.SATURDAY]; > >> weekdays[6] = localeWeekdays[Calendar.SUNDAY]; > >> > >> return weekdays; > >> } > >> > >> private static String[] mapWeekdaysStartingWithSunday(DateFormatSymbols > >> symbols) > >> { > >> String[] weekdays = new String[7]; > >> > >> String[] localeWeekdays = symbols.getShortWeekdays(); > >> > >> weekdays[0] = localeWeekdays[Calendar.SUNDAY]; > >> weekdays[1] = localeWeekdays[Calendar.MONDAY]; > >> weekdays[2] = localeWeekdays[Calendar.TUESDAY]; > >> weekdays[3] = localeWeekdays[Calendar.WEDNESDAY]; > >> weekdays[4] = localeWeekdays[Calendar.THURSDAY]; > >> weekdays[5] = localeWeekdays[Calendar.FRIDAY]; > >> weekdays[6] = localeWeekdays[Calendar.SATURDAY]; > >> > >> return weekdays; > >> } > >> > >> public static String[] mapMonths(DateFormatSymbols symbols) > >> { > >> String[] months = new String[12]; > >> > >> String[] localeMonths = symbols.getMonths(); > >> > >> months[0] = localeMonths[Calendar.JANUARY]; > >> months[1] = localeMonths[Calendar.FEBRUARY]; > >> months[2] = localeMonths[Calendar.MARCH]; > >> months[3] = localeMonths[Calendar.APRIL]; > >> months[4] = localeMonths[Calendar.MAY]; > >> months[5] = localeMonths[Calendar.JUNE]; > >> months[6] = localeMonths[Calendar.JULY]; > >> months[7] = localeMonths[Calendar.AUGUST]; > >> months[8] = localeMonths[Calendar.SEPTEMBER]; > >> months[9] = localeMonths[Calendar.OCTOBER]; > >> months[10] = localeMonths[Calendar.NOVEMBER]; > >> months[11] = localeMonths[Calendar.DECEMBER]; > >> > >> return months; > >> } > >> > >> > >> public void decode(FacesContext facesContext, UIComponent component) > >> { > >> RendererUtils.checkParamValidity(facesContext, component, > >> HtmlInputCalendar.class); > >> > >> HtmlRendererUtils.decodeUIInput(facesContext, component); > >> } > >> > >> public Object getConvertedValue(FacesContext facesContext, UIComponent > >> uiComponent, Object submittedValue) throws ConverterException > >> { > >> RendererUtils.checkParamValidity(facesContext, uiComponent, > >> HtmlInputCalendar.class); > >> > >> UIInput uiInput = (UIInput) uiComponent; > >> > >> Converter converter = uiInput.getConverter(); > >> > >> if(converter==null) > >> converter = new CalendarDateTimeConverter(); > >> > >> if (submittedValue != null && !(submittedValue instanceof String)) > >> { > >> throw new IllegalArgumentException("Submitted value of type > >> String expected"); > >> } > >> > >> return converter.getAsObject(facesContext, uiComponent, (String) > >> submittedValue); > >> } > >> > >> public interface DateConverter extends Converter > >> { > >> public Date getAsDate(FacesContext facesContext, UIComponent > >> uiComponent); > >> } > >> > >> public static class CalendarDateTimeConverter implements > >> DateConverter > >> { > >> > >> public Object getAsObject(FacesContext facesContext, UIComponent > >> uiComponent, String s) > >> { > >> if(s==null || s.trim().length()==0) > >> return null; > >> > >> DateFormat dateFormat = null; > >> > >> if(uiComponent instanceof HtmlInputCalendar && > >> ((HtmlInputCalendar) uiComponent).isRenderAsPopup()) > >> { > >> String popupDateFormat = ((HtmlInputCalendar) > >> uiComponent).getPopupDateFormat(); > >> > >> dateFormat = new > >> SimpleDateFormat(createJSPopupFormat(facesContext, popupDateFormat)); > >> } > >> else > >> { > >> dateFormat = createStandardDateFormat(facesContext); > >> } > >> > >> try > >> { > >> return dateFormat.parse(s); > >> } > >> catch (ParseException e) > >> { > >> throw new ConverterException(e); > >> } > >> } > >> > >> public Date getAsDate(FacesContext facesContext, UIComponent > >> uiComponent) > >> { > >> return RendererUtils.getDateValue(uiComponent); > >> } > >> > >> public static String createJSPopupFormat(FacesContext > >> facesContext, String popupDateFormat) > >> { > >> > >> if(popupDateFormat == null) > >> { > >> SimpleDateFormat defaultDateFormat = > >> createStandardDateFormat(facesContext); > >> popupDateFormat = defaultDateFormat.toPattern(); > >> } > >> > >> StringBuffer jsPopupDateFormat = new StringBuffer(); > >> > >> for(int i=0;i<popupDateFormat.length();i++) > >> { > >> char c = popupDateFormat.charAt(i); > >> > >> if(c=='M' || c=='d' || c=='y' || c==' ' || c=='.' || c=='/' > >> || c=='-') > >> jsPopupDateFormat.append(c); > >> } > >> return jsPopupDateFormat.toString().trim(); > >> } > >> > >> public String getAsString(FacesContext facesContext, UIComponent > >> uiComponent, Object o) > >> { > >> Date date = (Date) o; > >> > >> if(date==null) > >> return null; > >> > >> DateFormat dateFormat = null; > >> > >> if(uiComponent instanceof HtmlInputCalendar && > >> ((HtmlInputCalendar) uiComponent).isRenderAsPopup()) > >> { > >> String popupDateFormat = ((HtmlInputCalendar) > >> uiComponent).getPopupDateFormat(); > >> > >> dateFormat = new > >> SimpleDateFormat(createJSPopupFormat(facesContext, popupDateFormat)); > >> } > >> else > >> { > >> dateFormat = createStandardDateFormat(facesContext); > >> } > >> > >> return dateFormat.format(date); > >> } > >> > >> private static SimpleDateFormat > >> createStandardDateFormat(FacesContext facesContext) > >> { > >> DateFormat dateFormat; > >> dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, > >> DateFormat.SHORT, > >> facesContext.getViewRoot().getLocale()); > >> > >> if(dateFormat instanceof SimpleDateFormat) > >> return (SimpleDateFormat) dateFormat; > >> else > >> return new SimpleDateFormat("dd.MM.yyyy"); > >> } > >> > >> } > >>} > >> > >> > >> > >> > >

