/* * � Copyright IBM Corp. 2010, 2013 * * 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 com.ibm.xsp.extlib.renderkit.html_extended.data; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.faces.application.FacesMessage; import javax.faces.application.FacesMessage.Severity; import javax.faces.component.UIComponent; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import com.ibm.commons.util.FilteredIterator; import com.ibm.commons.util.StringUtil; import com.ibm.xsp.extlib.component.data.FormLayout; import com.ibm.xsp.extlib.component.data.UIFormLayoutRow; import com.ibm.xsp.extlib.component.data.UIFormTable; import com.ibm.xsp.extlib.renderkit.html_extended.FacesRendererEx; import com.ibm.xsp.renderkit.html_basic.HtmlRendererUtil; import com.ibm.xsp.util.FacesUtil; import com.ibm.xsp.util.JSUtil; /** * Base class for rendering a form layout. */ public abstract class FormLayoutRenderer extends FacesRendererEx { protected static final int PROP_BLANKIMG = 1; // Error Summary protected static final int PROP_STYLEERRORSUMMARY = 20; protected static final int PROP_STYLECLASSERRORSUMMARY = 21; protected static final int PROP_ERRORSUMMARYMAINTEXT = 22; protected static final int PROP_ERRORSUMMARYSTYLE = 23; protected static final int PROP_ERRORSUMMARYCLASS = 24; protected static final int PROP_WARNSUMMARYMAINTEXT = 25; protected static final int PROP_WARNSUMMARYSTYLE = 26; protected static final int PROP_WARNSUMMARYCLASS = 27; protected static final int PROP_INFOSUMMARYMAINTEXT = 28; protected static final int PROP_INFOSUMMARYSTYLE = 29; protected static final int PROP_INFOSUMMARYCLASS = 30; // Header protected static final int PROP_STYLEHEADER = 40; protected static final int PROP_STYLECLASSHEADER = 41; protected static final int PROP_TAGFORMTITLE = 42; protected static final int PROP_STYLEFORMTITLE = 43; protected static final int PROP_STYLECLASSFORMTITLE = 44; protected static final int PROP_TAGFORMDESC = 45; protected static final int PROP_STYLEFORMDESC = 46; protected static final int PROP_STYLECLASSFORMDESC = 47; // Footer protected static final int PROP_STYLEFOOTER = 50; protected static final int PROP_STYLECLASSFOOTER = 51; // Row - error protected static final int PROP_ERRORROWSTYLE = 60; protected static final int PROP_ERRORROWCLASS = 61; protected static final int PROP_ERRORIMGSTYLE = 62; protected static final int PROP_ERRORIMGCLASS = 63; protected static final int PROP_ERRORIMGSRC = 64; protected static final int PROP_ERRORIMGALT = 65; protected static final int PROP_ERRORMSGALTTEXT = 66; protected static final int PROP_ERRORMSGALTTEXTCLASS = 67; protected static final int PROP_FATALMSGALTTEXT = 68; protected static final int PROP_ERRORROWSTYLENESTED = 69; protected static final int PROP_ERRORROWSTYLENESTED_RTL = 120; // Row - warn protected static final int PROP_WARNROWSTYLE = 70; protected static final int PROP_WARNROWCLASS = 71; protected static final int PROP_WARNIMGSTYLE = 72; protected static final int PROP_WARNIMGCLASS = 73; protected static final int PROP_WARNIMGSRC = 74; protected static final int PROP_WARNIMGALT = 75; protected static final int PROP_WARNMSGALTTEXT = 76; protected static final int PROP_WARNMSGALTTEXTCLASS = 77; // Row - info protected static final int PROP_INFOROWSTYLE = 80; protected static final int PROP_INFOROWCLASS = 81; protected static final int PROP_INFOIMGSTYLE = 82; protected static final int PROP_INFOIMGCLASS = 83; protected static final int PROP_INFOIMGSRC = 84; protected static final int PROP_INFOIMGALT = 85; protected static final int PROP_INFOMSGALTTEXT = 86; protected static final int PROP_INFOMSGALTTEXTCLASS = 87; // Row - field protected static final int PROP_FIELDROWSTYLE = 90; protected static final int PROP_FIELDROWCLASS = 91; protected static final int PROP_FIELDLABELWIDTH = 92; protected static final int PROP_FIELDLABELSTYLE = 93; protected static final int PROP_FIELDLABELCLASS = 94; protected static final int PROP_FIELDLABELREQUIREDCLASS = 95; protected static final int PROP_FIELDLABELREQUIREDTEXT = 96; protected static final int PROP_FIELDEDITSTYLE = 97; protected static final int PROP_FIELDEDITCLASS = 98; // Row - help protected static final int PROP_HELPROWSTYLE = 100; protected static final int PROP_HELPROWCLASS = 101; protected static final int PROP_HELPIMGSTYLE = 102; protected static final int PROP_HELPIMGCLASS = 103; protected static final int PROP_HELPIMGSRC = 104; protected static final int PROP_HELPIMGALT = 105; protected static final int PROP_HELPMSGALTTEXT = 106; protected static final int PROP_HELPMSGALTTEXTCLASS = 107; // Note, 120 is above. @Override protected Object getProperty(int prop) { switch(prop) { // Info & Warn are equivalent to errors so far case PROP_WARNSUMMARYCLASS: return getProperty(PROP_ERRORSUMMARYCLASS); case PROP_INFOSUMMARYCLASS: return getProperty(PROP_ERRORSUMMARYCLASS); case PROP_WARNROWSTYLE: return getProperty(PROP_ERRORROWSTYLE); case PROP_WARNROWCLASS: return getProperty(PROP_ERRORROWCLASS); case PROP_WARNIMGSTYLE: return getProperty(PROP_ERRORIMGSTYLE); case PROP_WARNIMGCLASS: return getProperty(PROP_ERRORIMGCLASS); case PROP_WARNIMGSRC: return getProperty(PROP_ERRORIMGSRC); case PROP_WARNIMGALT: return getProperty(PROP_ERRORIMGALT); case PROP_WARNMSGALTTEXT: return getProperty(PROP_ERRORMSGALTTEXT); case PROP_WARNMSGALTTEXTCLASS: return getProperty(PROP_ERRORMSGALTTEXTCLASS); case PROP_FATALMSGALTTEXT: return getProperty(PROP_ERRORMSGALTTEXT); case PROP_INFOROWSTYLE: return getProperty(PROP_ERRORROWSTYLE); case PROP_INFOROWCLASS: return getProperty(PROP_ERRORROWCLASS); case PROP_INFOIMGSTYLE: return getProperty(PROP_ERRORIMGSTYLE); case PROP_INFOIMGCLASS: return getProperty(PROP_ERRORIMGCLASS); case PROP_INFOIMGSRC: return getProperty(PROP_ERRORIMGSRC); case PROP_INFOIMGALT: return getProperty(PROP_ERRORIMGALT); case PROP_INFOMSGALTTEXT: return getProperty(PROP_ERRORMSGALTTEXT); case PROP_INFOMSGALTTEXTCLASS: return getProperty(PROP_ERRORMSGALTTEXTCLASS); } return super.getProperty(prop); } @Override public void decode(FacesContext context, UIComponent component) { // Nothing to decode here... } @Override public boolean getRendersChildren() { return true; } @Override public void encodeBegin(FacesContext context, UIComponent component) throws IOException { ResponseWriter w = context.getResponseWriter(); FormLayout formLayout = (FormLayout)component; boolean rendered = component.isRendered(); if(!rendered) { return; } // Render the form writeFormLayout(context, w, formLayout); } @Override public void encodeChildren(FacesContext context, UIComponent component) throws IOException { } @Override public void encodeEnd(FacesContext context, UIComponent component) throws IOException { } // ================================================================ // Main Form // ================================================================ protected abstract void writeFormLayout(FacesContext context, ResponseWriter w, FormLayout c) throws IOException; // ================================================================ // Error Summary Helpers // ================================================================ private static class MsgIterator extends FilteredIterator<FacesMessage> { private Severity s; MsgIterator(Iterable<FacesMessage> it, Severity s) { super(it.iterator()); this.s = s; } @Override protected boolean accept(Object object) { FacesMessage m = (FacesMessage)object; return m.getSeverity()==s; } } protected void writeErrorSummaryContent(FacesContext context, ResponseWriter w, FormLayout c, Iterator<FacesMessage> msg) throws IOException { boolean fatal = false; boolean err = false; boolean warn = false; boolean info = false; List<FacesMessage> l = new ArrayList<FacesMessage>(); while(msg.hasNext()) { FacesMessage m = msg.next(); l.add(m); if(m.getSeverity()==FacesMessage.SEVERITY_ERROR) { err = true; } else if(m.getSeverity()==FacesMessage.SEVERITY_WARN) { warn = true; } else if(m.getSeverity()==FacesMessage.SEVERITY_INFO) { info = true; } else if(m.getSeverity()==FacesMessage.SEVERITY_FATAL) { fatal = true; } } if( fatal ){ writeErrorSummaryMainText(context, w, c, FacesMessage.SEVERITY_FATAL); writeErrorSummaryRows(context, w, c, new MsgIterator(l, FacesMessage.SEVERITY_FATAL)); } if(err) { writeErrorSummaryMainText(context, w, c, FacesMessage.SEVERITY_ERROR); writeErrorSummaryRows(context, w, c, new MsgIterator(l, FacesMessage.SEVERITY_ERROR)); } if(warn) { writeErrorSummaryMainText(context, w, c, FacesMessage.SEVERITY_WARN); writeErrorSummaryRows(context, w, c, new MsgIterator(l, FacesMessage.SEVERITY_WARN)); } if(info) { writeErrorSummaryMainText(context, w, c, FacesMessage.SEVERITY_INFO); writeErrorSummaryRows(context, w, c, new MsgIterator(l, FacesMessage.SEVERITY_INFO)); } } private void startErrorSummaryContainer(FacesContext context, ResponseWriter w, FormLayout c, FacesMessage.Severity sev) throws IOException { w.startElement("div", c); // $NON-NLS-1$ String style = (String)getProperty(PROP_ERRORSUMMARYSTYLE); if(sev==FacesMessage.SEVERITY_WARN) { style = (String)getProperty(PROP_WARNSUMMARYSTYLE); } else if(sev==FacesMessage.SEVERITY_INFO) { style = (String)getProperty(PROP_INFOSUMMARYSTYLE); } if(StringUtil.isNotEmpty(style)) { w.writeAttribute("style", style, null); // $NON-NLS-1$ } String cls = (String)getProperty(PROP_ERRORSUMMARYCLASS); if(sev==FacesMessage.SEVERITY_WARN) { cls = (String)getProperty(PROP_WARNSUMMARYCLASS); } else if(sev==FacesMessage.SEVERITY_INFO) { cls = (String)getProperty(PROP_INFOSUMMARYCLASS); } if(StringUtil.isNotEmpty(cls)) { w.writeAttribute("class", cls, null); // $NON-NLS-1$ } w.writeAttribute("role", "alert", null); // $NON-NLS-1$ $NON-NLS-2$ } private void writeErrorSummaryMessage(FacesContext context, ResponseWriter w, FormLayout c, FacesMessage.Severity sev) throws IOException { String mainText = c.getErrorSummaryText(); if(StringUtil.isEmpty(mainText)) { if(sev==FacesMessage.SEVERITY_WARN) { mainText = (String)getProperty(PROP_WARNSUMMARYMAINTEXT); } else if(sev==FacesMessage.SEVERITY_INFO) { mainText = (String)getProperty(PROP_INFOSUMMARYMAINTEXT); }else { mainText = (String)getProperty(PROP_ERRORSUMMARYMAINTEXT); } } writeErrorMessage(context, w, c, sev, mainText); } private void endErrorSummaryContainer(FacesContext context, ResponseWriter w, FormLayout c, FacesMessage.Severity sev) throws IOException { w.endElement("div"); // $NON-NLS-1$ } protected void writeErrorSummaryMainText(FacesContext context, ResponseWriter w, FormLayout c, FacesMessage.Severity sev) throws IOException { startErrorSummaryContainer(context, w, c, sev); writeErrorSummaryMessage(context, w, c, sev); endErrorSummaryContainer(context, w, c, sev); } protected void writeErrorSummaryRows(FacesContext context, ResponseWriter w, FormLayout c, Iterator<FacesMessage> msg) throws IOException { w.startElement("ul", c); // $NON-NLS-1$ while(msg.hasNext()) { FacesMessage m = msg.next(); writeErrorSummaryRow(context, w, c, m); } w.endElement("ul"); // $NON-NLS-1$ } protected void writeErrorSummaryRow(FacesContext context, ResponseWriter w, FormLayout c, FacesMessage m) throws IOException { w.startElement("li", c); // $NON-NLS-1$ String title = null; if(StringUtil.isNotEmpty(title)) { // TODO supposed to use the field label here. w.startElement("strong", c); // $NON-NLS-1$ w.writeText(title,null); w.endElement("strong"); // $NON-NLS-1$ } String text = m.getSummary(); if( StringUtil.isNotEmpty(text) ){ w.writeText(text,null); } w.endElement("li"); // $NON-NLS-1$ } // ================================================================ // Error Helpers // ================================================================ protected void writeErrorMessage(FacesContext context, ResponseWriter w, FormLayout c, FacesMessage msg) throws IOException { writeErrorMessage(context, w, c, msg.getSeverity(), msg.getSummary()); } protected void writeErrorMessage(FacesContext context, ResponseWriter w, FormLayout c, FacesMessage.Severity sev, String text) throws IOException { if(sev==FacesMessage.SEVERITY_ERROR) { writeErrorMessage(context, w, c, text); } else if(sev==FacesMessage.SEVERITY_WARN) { writeWarnMessage(context, w, c, text); } else if(sev==FacesMessage.SEVERITY_INFO) { writeInfoMessage(context, w, c, text); } else if(sev == FacesMessage.SEVERITY_FATAL){ writeFatalMessage(context, w, c, text); } } protected void writeFatalMessage(FacesContext context, ResponseWriter w, FormLayout c, String msg) throws IOException { boolean isFatalSeverity = true; writeErrorOrFatalMessage(context, w, c, msg, isFatalSeverity); } protected void writeErrorMessage(FacesContext context, ResponseWriter w, FormLayout c, String msg) throws IOException { boolean isFatalSeverity = false; writeErrorOrFatalMessage(context, w, c, msg, isFatalSeverity); } private void writeErrorOrFatalMessage(FacesContext context, ResponseWriter w, FormLayout c, String msg, boolean isFatalSeverity) throws IOException { w.startElement("img", c); // $NON-NLS-1$ String style = (String)getProperty(PROP_ERRORIMGSTYLE); if(StringUtil.isNotEmpty(style)) { w.writeAttribute("style", style, null); // $NON-NLS-1$ } String cls = (String)getProperty(PROP_ERRORIMGCLASS); if(StringUtil.isNotEmpty(cls)) { w.writeAttribute("class", cls, null); // $NON-NLS-1$ } String bgif = (String)getProperty(PROP_ERRORIMGSRC); if(StringUtil.isNotEmpty(bgif)) { w.writeAttribute("src",HtmlRendererUtil.getImageURL(context,bgif),null); // $NON-NLS-1$ } String alt = (String)getProperty(PROP_ERRORIMGALT); if(StringUtil.isNotEmpty(alt)) { // "Error" w.writeAttribute("alt", alt, null); // $NON-NLS-1$ } w.endElement("img"); // $NON-NLS-1$ // "Error:" or "Fatal:" String altText = isFatalSeverity? (String)getProperty(PROP_FATALMSGALTTEXT) : (String)getProperty(PROP_ERRORMSGALTTEXT); if(StringUtil.isNotEmpty(altText)) { w.startElement("span", c); // $NON-NLS-1$ String altClass = (String)getProperty(PROP_ERRORMSGALTTEXTCLASS); if(StringUtil.isNotEmpty(altClass)) { w.writeAttribute("class", altClass, null); // $NON-NLS-1$ } w.writeText(altText, null); w.endElement("span"); // $NON-NLS-1$ } JSUtil.writeTextBlank(w); //   if( StringUtil.isNotEmpty(msg) ){ w.writeText(msg, null); } } protected void writeWarnMessage(FacesContext context, ResponseWriter w, FormLayout c, String msg) throws IOException { w.startElement("img", c); // $NON-NLS-1$ String style = (String)getProperty(PROP_WARNIMGSTYLE); if(StringUtil.isNotEmpty(style)) { w.writeAttribute("style", style, null); // $NON-NLS-1$ } String cls = (String)getProperty(PROP_WARNIMGCLASS); if(StringUtil.isNotEmpty(cls)) { w.writeAttribute("class", cls, null); // $NON-NLS-1$ } String bgif = (String)getProperty(PROP_WARNIMGSRC); if(StringUtil.isNotEmpty(bgif)) { w.writeAttribute("src",HtmlRendererUtil.getImageURL(context,bgif),null); // $NON-NLS-1$ } String alt = (String)getProperty(PROP_WARNIMGALT); if(StringUtil.isNotEmpty(alt)) { w.writeAttribute("alt", alt, null); // $NON-NLS-1$ } w.endElement("img"); // $NON-NLS-1$ String altText = (String)getProperty(PROP_WARNMSGALTTEXT); if(StringUtil.isNotEmpty(altText)) { w.startElement("span", c); // $NON-NLS-1$ String altClass = (String)getProperty(PROP_WARNMSGALTTEXTCLASS); if(StringUtil.isNotEmpty(altClass)) { w.writeAttribute("class", altClass, null); // $NON-NLS-1$ } w.writeText(altText, null); w.endElement("span"); // $NON-NLS-1$ } JSUtil.writeTextBlank(w); //   if( StringUtil.isNotEmpty(msg) ){ w.writeText(msg, null); } } protected void writeInfoMessage(FacesContext context, ResponseWriter w, FormLayout c, String msg) throws IOException { w.startElement("img", c); // $NON-NLS-1$ String style = (String)getProperty(PROP_INFOIMGSTYLE); if(StringUtil.isNotEmpty(style)) { w.writeAttribute("style", style, null); // $NON-NLS-1$ } String cls = (String)getProperty(PROP_INFOIMGCLASS); if(StringUtil.isNotEmpty(cls)) { w.writeAttribute("class", cls, null); // $NON-NLS-1$ } String bgif = (String)getProperty(PROP_INFOIMGSRC); if(StringUtil.isNotEmpty(bgif)) { w.writeAttribute("src",HtmlRendererUtil.getImageURL(context,bgif),null); // $NON-NLS-1$ } String alt = (String)getProperty(PROP_INFOIMGALT); if(StringUtil.isNotEmpty(alt)) { w.writeAttribute("alt", alt, null); // $NON-NLS-1$ } w.endElement("img"); // $NON-NLS-1$ String altText = (String)getProperty(PROP_INFOMSGALTTEXT); if(StringUtil.isNotEmpty(altText)) { w.startElement("span", c); // $NON-NLS-1$ String altClass = (String)getProperty(PROP_INFOMSGALTTEXTCLASS); if(StringUtil.isNotEmpty(altClass)) { w.writeAttribute("class", altClass, null); // $NON-NLS-1$ } w.writeText(altText, null); w.endElement("span"); // $NON-NLS-1$ } JSUtil.writeTextBlank(w); //   if( StringUtil.isNotEmpty(msg) ){ w.writeText(msg, null); } } // ================================================================ // Header // ================================================================ protected void writeHeader(FacesContext context, ResponseWriter w, FormLayout c) throws IOException { String formTitle = c.getFormTitle(); String description = c.getFormDescription(); if(StringUtil.isNotEmpty(formTitle) || StringUtil.isNotEmpty(description)) { writeFormTitle(context, w, c, formTitle, description); } UIComponent header = c.getFacet(UIFormTable.FACET_HEADER); if(header!=null) { writeHeaderFacet(context,w,c,header); } } protected void writeFormTitle(FacesContext context, ResponseWriter w, FormLayout c, String formTitle, String description) throws IOException { writeFormTitleContent(context, w, c, formTitle, description); } protected void writeFormTitleContent(FacesContext context, ResponseWriter w, FormLayout c, String formTitle, String description) throws IOException { String mainTag = (String)getProperty(PROP_TAGFORMTITLE); if(StringUtil.isNotEmpty(mainTag)) { w.startElement(mainTag, c); String style = (String)getProperty(PROP_STYLEFORMTITLE); if(StringUtil.isNotEmpty(style)) { w.writeAttribute("style", style, null); // $NON-NLS-1$ } String cls = (String)getProperty(PROP_STYLECLASSFORMTITLE); if(StringUtil.isNotEmpty(cls)) { w.writeAttribute("class", cls, null); // $NON-NLS-1$ } } w.writeAttribute("id", c.getClientId(context) + "_title", null); // $NON-NLS-1$ $NON-NLS-2$ if(StringUtil.isNotEmpty(formTitle)) { w.writeText(formTitle,null); } if(StringUtil.isNotEmpty(description)) { String descTag = (String)getProperty(PROP_TAGFORMDESC); if(StringUtil.isNotEmpty(descTag)) { w.startElement(descTag, c); String style = (String)getProperty(PROP_STYLEFORMDESC); if(StringUtil.isNotEmpty(style)) { w.writeAttribute("style", style, null); // $NON-NLS-1$ } String cls = (String)getProperty(PROP_STYLECLASSFORMDESC); if(StringUtil.isNotEmpty(cls)) { w.writeAttribute("class", cls, null); // $NON-NLS-1$ } } w.writeText(description,null); if(StringUtil.isNotEmpty(descTag)) { w.endElement(descTag); } } if(StringUtil.isNotEmpty(mainTag)) { w.endElement(mainTag); } } protected void writeHeaderFacet(FacesContext context, ResponseWriter w, FormLayout c, UIComponent header) throws IOException { writeHeaderFacetContext(context, w, c, header); } protected void writeHeaderFacetContext(FacesContext context, ResponseWriter w, FormLayout c, UIComponent header) throws IOException { FacesUtil.renderChildren(context, header); } // ================================================================ // Footer // ================================================================ protected void writeFooter(FacesContext context, ResponseWriter w, FormLayout c) throws IOException { UIComponent footer = c.getFacet(UIFormTable.FACET_FOOTER); if(footer!=null) { writeFooterFacet(context,w,c,footer); } } protected void writeFooterFacet(FacesContext context, ResponseWriter w, FormLayout c, UIComponent footer) throws IOException { writeFooterFacetContent(context, w, c, footer); } protected void writeFooterFacetContent(FacesContext context, ResponseWriter w, FormLayout c, UIComponent footer) throws IOException { FacesUtil.renderChildren(context, footer); } // ================================================================ // Form // ================================================================ protected void writeFormRowRequiredContent(FacesContext context, ResponseWriter w, FormLayout c, UIFormLayoutRow row, UIInput edit) throws IOException { String reqClass = (String)getProperty(PROP_FIELDLABELREQUIREDCLASS); String reqText = (String)getProperty(PROP_FIELDLABELREQUIREDTEXT); if(StringUtil.isNotEmpty(reqClass) || StringUtil.isNotEmpty(reqText)) { w.startElement("span", c); // $NON-NLS-1$ if(StringUtil.isNotEmpty(reqClass)) { w.writeAttribute("class", reqClass, null); // $NON-NLS-1$ } if(StringUtil.isNotEmpty(reqText)) { w.writeText(reqText, null); } w.endElement("span"); // $NON-NLS-1$ } } protected void writeFormRowDataLabel(FacesContext context, ResponseWriter w, FormLayout c, UIFormLayoutRow row, UIInput edit, String label) throws IOException { w.writeText(label, null); } protected void writeFormRowDataField(FacesContext context, ResponseWriter w, FormLayout c, UIFormLayoutRow row, UIInput edit) throws IOException { FacesUtil.renderChildren(context, row); } protected void writeFormRowDataLabelFacet(FacesContext context, ResponseWriter w, FormLayout c, UIFormLayoutRow row, UIInput edit, UIComponent label) throws IOException { FacesUtil.renderComponent(context, label); } protected void writeFormRowDataHelp(FacesContext context, ResponseWriter w, FormLayout c, UIFormLayoutRow row, UIInput edit, String helpId) throws IOException { // TODO: how should the help be implemented? w.startElement("a", c); w.writeAttribute("href", "javascript:;", null); // $NON-NLS-1$ $NON-NLS-2$ w.writeAttribute("aria-haspopup", "true", null); // $NON-NLS-1$ $NON-NLS-2$ w.writeAttribute("aria-owns", helpId, null); // $NON-NLS-1$ w.startElement("img", c); // $NON-NLS-1$ String style = (String)getProperty(PROP_HELPIMGSTYLE); if(StringUtil.isNotEmpty(style)) { w.writeAttribute("style", style, null); // $NON-NLS-1$ } String cls = (String)getProperty(PROP_HELPIMGCLASS); if(StringUtil.isNotEmpty(cls)) { w.writeAttribute("class", cls, null); // $NON-NLS-1$ } String bgif = (String)getProperty(PROP_HELPIMGSRC); if(StringUtil.isNotEmpty(bgif)) { w.writeAttribute("src",HtmlRendererUtil.getImageURL(context,bgif),null); // $NON-NLS-1$ } String alt = (String)getProperty(PROP_HELPIMGALT); if(StringUtil.isNotEmpty(alt)) { w.writeAttribute("alt", alt, null); // $NON-NLS-1$ } w.endElement("img"); // $NON-NLS-1$ w.endElement("a"); } protected void writeFormRowDataHelpFacet(FacesContext context, ResponseWriter w, FormLayout c, UIFormLayoutRow row, UIInput edit, UIComponent help) throws IOException { FacesUtil.renderComponent(context, help); } }