/** * Copyright 2014-2017 Riccardo Massera (TheCoder4.Eu) * * This file is part of BootsFaces. * * 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 net.bootsfaces.component.commandButton; import java.io.IOException; import java.util.Map; import javax.faces.FacesException; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.render.FacesRenderer; import net.bootsfaces.component.ajax.AJAXRenderer; import net.bootsfaces.component.icon.IconRenderer; import net.bootsfaces.render.CoreRenderer; import net.bootsfaces.render.H; import net.bootsfaces.render.R; import net.bootsfaces.render.Responsive; import net.bootsfaces.render.Tooltip; /** This class generates the HTML code of <b:commandButton />. */ @FacesRenderer(componentFamily = "net.bootsfaces.component", rendererType = CommandButton.DEFAULT_RENDERER) public class CommandButtonRenderer extends CoreRenderer { @Override public void decode(FacesContext context, UIComponent component) { if (componentIsDisabledOrReadonly(component)) { return; } boolean found=false; String clientId = component.getClientId(context); String param = clientId; Map<String, String> params = context.getExternalContext().getRequestParameterMap(); if (params.containsKey(param)) { found=true; } else { String source = params.get("javax.faces.source"); if (clientId.equals(source)) { found = true; } } if (found) { new AJAXRenderer().decode(context, component); } } @Override public void encodeBegin(FacesContext context, UIComponent component) throws IOException { if (!component.isRendered()) { return; } boolean idHasBeenRendered=false; CommandButton commandButton = (CommandButton) component; ResponseWriter rw = context.getResponseWriter(); String clientId = component.getClientId(context); // add responsive style String clazz = Responsive.getResponsiveStyleClass(commandButton, false).trim(); boolean isResponsive = clazz.length() > 0; if (isResponsive) { rw.startElement("div", commandButton); rw.writeAttribute("class", clazz, null); rw.writeAttribute("id", clientId, "id"); idHasBeenRendered = true; } String type = commandButton.getType(); if (null == type) type = "submit"; String style = commandButton.getStyle(); rw.startElement("button", component); rw.writeAttribute("type", type, null); if (!idHasBeenRendered) { rw.writeAttribute("id", clientId, "id"); } rw.writeAttribute("name", clientId, "name"); if (null != commandButton.getDir()) { rw.writeAttribute("dir", commandButton.getDir(), "dir"); } Tooltip.generateTooltip(context, commandButton, rw); writeAttribute(rw, "style", style, "style"); rw.writeAttribute("class", getStyleClasses(commandButton, isResponsive), "class"); if (commandButton.isDisabled()) { rw.writeAttribute("disabled", "disabled", "disabled"); } if (!type.equals("reset") && !type.equals("button")) { // Check if it is in a Form String formId = R.findComponentFormId(context, component); if (formId == null) { throw new FacesException("CommandButton : '" + clientId + "' must be inside a form element"); } } AJAXRenderer.generateBootsFacesAJAXAndJavaScript(context, commandButton, rw, false); R.encodeHTML4DHTMLAttrs(rw, commandButton.getAttributes(), H.ALLBUTTON); } @Override public boolean getRendersChildren() { return true; } @Override public void encodeEnd(FacesContext context, UIComponent component) throws IOException { ResponseWriter rw = context.getResponseWriter(); // Map<String, Object> attrs = component.getAttributes(); CommandButton commandButton = (CommandButton) component; Object value = commandButton.getValue(); String icon = commandButton.getIcon(); String faicon = commandButton.getIconAwesome(); boolean fa = false; // flag to indicate whether the selected icon set is // Font Awesome or not. if (faicon != null) { icon = faicon; fa = true; } if (icon != null) { Object ialign = commandButton.getIconAlign(); // Default Left if (ialign != null && ialign.equals("right")) { value = value != null ? value + " " : null; writeText(rw, value, null); IconRenderer.encodeIcon(rw, component, icon, fa, commandButton.getIconSize(), commandButton.getIconRotate(), commandButton.getIconFlip(), commandButton.isIconSpin(), null, null, false, false, false, false); } else { IconRenderer.encodeIcon(rw, component, icon, fa, commandButton.getIconSize(), commandButton.getIconRotate(), commandButton.getIconFlip(), commandButton.isIconSpin(), null, null, false, false, false, false); value = value != null ? " " + value : null; writeText(rw, value, null); } } else { if (component.getChildCount() > 0) { value = value != null ? " " + value : null; writeText(rw, value, null); } else { writeText(rw, value, null); } } rw.endElement("button"); String clazz = Responsive.getResponsiveStyleClass(commandButton, false).trim(); boolean isResponsive = clazz.length() > 0; if (isResponsive) { rw.endElement("div"); } Tooltip.activateTooltips(context, component); } private String getStyleClasses(CommandButton component, boolean isResponsive) { StringBuilder sb = new StringBuilder(40); // optimize int sb.append("btn"); String size = component.getSize(); if (size != null) { sb.append(" btn-").append(size); } // TBS3 Si usa look, non severity String look = component.getLook(); if (look != null) { sb.append(" btn-").append(look); } else { sb.append(" btn-default"); } if (component.isDisabled()) { sb.append(" " + "disabled"); } if (isResponsive) { sb.append(" btn-block"); } String sclass = component.getStyleClass(); if (sclass != null) { sb.append(" ").append(sclass); } return sb.toString().trim(); } }