package org.richfaces.renderkit.html; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.faces.application.ResourceDependencies; import javax.faces.application.ResourceDependency; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import org.richfaces.cdk.annotations.JsfRenderer; import org.richfaces.component.AbstractLightbox; import org.richfaces.javascript.JSFunction; import org.richfaces.renderkit.RendererBase; import org.richfaces.ui.common.HtmlConstants; @JsfRenderer(family = AbstractLightbox.COMPONENT_FAMILY, type = LightboxRenderer.RENDERER_TYPE) @ResourceDependencies({ @ResourceDependency(name = "base-component.reslib", library = "org.richfaces", target = "head"), @ResourceDependency(name = "jquery.lightbox.js", target = "head"), @ResourceDependency(name = "richfaces.lightbox.js", target = "head"), @ResourceDependency(name = "jquery.lightbox.css", target = "head") }) public class LightboxRenderer extends RendererBase { public static final String RENDERER_TYPE = "org.richfaces.Lightbox"; private static final Map<String, Object> DEFAULTS; /** * Following defaults are be used by addOptionIfSetAndNotDefault */ static { Map<String, Object> defaults = new HashMap<String, Object>(); defaults.put("overlayBgColor", AbstractLightbox.DEFAULT_OVERLAY_BG_COLOR); defaults.put("overlayOpacity", AbstractLightbox.DEFAULT_OVERLAY_OPACITY); defaults.put("containerBorderSize", AbstractLightbox.DEFAULT_CONTAINER_BORDER_SIZE); defaults.put("containerResizeSpeed", AbstractLightbox.DEFAULT_CONTAINER_RESIZE_SPEED); defaults.put("fixedNavigation", AbstractLightbox.DEFAULT_FIXED_NAVIGATION); defaults.put("keyToClose", AbstractLightbox.DEFAULT_KEY_TO_CLOSE); defaults.put("keyToNext", AbstractLightbox.DEFAULT_KEY_TO_NEXT); defaults.put("keyToPrev", AbstractLightbox.DEFAULT_KEY_TO_PREV); defaults.put("txtImage", AbstractLightbox.DEFAULT_TXT_IMAGE); defaults.put("txtOf", AbstractLightbox.DEFAULT_TXT_OF); DEFAULTS = Collections.unmodifiableMap(defaults); } @Override protected Class<? extends UIComponent> getComponentClass() { return AbstractLightbox.class; } @Override protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent component) throws IOException { AbstractLightbox lightbox = (AbstractLightbox) component; final HashMap<String, Object> options = new HashMap<String, Object>(); addOptionIfSetAndOrDefault("imageBlank", lightbox.getImageBlank(), getURL(context, "/lightbox-blank.gif"), options); addOptionIfSetAndOrDefault("imageLoading", lightbox.getImageLoading(), getURL(context, "/lightbox-ico-loading.gif"), options); addOptionIfSetAndOrDefault("imageBtnNext", lightbox.getImageBtnNext(), getURL(context, "/lightbox-btn-next.gif"), options); addOptionIfSetAndOrDefault("imageBtnPrev", lightbox.getImageBtnPrev(), getURL(context, "/lightbox-btn-prev.gif"), options); addOptionIfSetAndOrDefault("imageBtnClose", lightbox.getImageBtnClose(), getURL(context, "/lightbox-btn-close.gif"), options); addOptionIfSetAndNotDefault("containerBorderSize", lightbox.getContainerBorderSize(), options); addOptionIfSetAndNotDefault("containerResizeSpeed", lightbox.getContainerResizeSpeed(), options); addOptionIfSetAndNotDefault("fixedNavigation", lightbox.getFixedNavigation(), options); addOptionIfSetAndNotDefault("keyToClose", lightbox.getKeyToClose(), options); addOptionIfSetAndNotDefault("keyToNext", lightbox.getKeyToNext(), options); addOptionIfSetAndNotDefault("keyToPrev", lightbox.getKeyToPrev(), options); addOptionIfSetAndNotDefault("overlayBgColor", lightbox.getOverlayBgColor(), options); addOptionIfSetAndNotDefault("overlayOpacity", lightbox.getOverlayOpacity(), options); addOptionIfSetAndNotDefault("txtImage", lightbox.getTxtImage(), options); addOptionIfSetAndNotDefault("txtOf", lightbox.getTxtOf(), options); writer.startElement(HtmlConstants.DIV_ELEM, component); writer.writeAttribute(HtmlConstants.ID_ATTRIBUTE, getUtils().clientId(context, component), "id"); getUtils().writeScript(context, component, new JSFunction("RichFaces.Lightbox", lightbox.getSelector(), options)); writer.endElement(HtmlConstants.DIV_ELEM); } protected void addOptionIfSetAndNotDefault(String optionName, Object value, Map<String, Object> options) { if (value != null && !"".equals(value) && !value.equals(DEFAULTS.get(optionName))) { options.put(optionName, value); } } protected void addOptionIfSetAndOrDefault(String optionName, Object value, Object defaultValue, Map<String, Object> options) { if (value != null && !"".equals(value)) { options.put(optionName, value); } else { options.put(optionName, defaultValue); } } private String getURL(FacesContext context, String path) { return context.getApplication().getResourceHandler().createResource(path).getRequestPath(); } }