001/*
002 * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl-2.1.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     <a href="mailto:grenard@nuxeo.com">Guillaume</a>
016 */
017package org.nuxeo.ecm.platform.ui.web.renderer;
018
019import java.io.IOException;
020import java.util.Iterator;
021
022import javax.faces.component.UIComponent;
023import javax.faces.context.FacesContext;
024import javax.faces.context.ResponseWriter;
025import javax.faces.model.SelectItem;
026
027import org.apache.commons.lang.StringUtils;
028import org.nuxeo.ecm.platform.ui.web.util.ComponentUtils;
029
030import com.sun.faces.renderkit.RenderKitUtils;
031import com.sun.faces.renderkit.html_basic.SelectManyCheckboxListRenderer;
032
033/**
034 * @since 6.0
035 */
036public class NxSelectManyCheckboxListRenderer extends SelectManyCheckboxListRenderer {
037
038    final String MORE_LESS_LIMIT_PROPERTY = "moreLessLimit";
039
040    final String EMPTY_CHOICE_PROPERTY = "emptyChoiceMessage";
041
042    public static final String RENDERER_TYPE = "org.nuxeo.NxSelectManyCheckboxList";
043
044    @Override
045    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
046
047        super.encodeEnd(context, component);
048
049        final String moreLessLimit = (String) component.getAttributes().get(MORE_LESS_LIMIT_PROPERTY);
050        if (moreLessLimit != null) {
051            ResponseWriter writer = context.getResponseWriter();
052            final int moreLessLimitInt = Integer.parseInt(moreLessLimit);
053            writer.startElement("a", component);
054            writer.writeAttribute("href", "#", null);
055            writer.writeAttribute("onclick", "nuxeo.utils.moreLessTableRows('" + component.getClientId() + "', true, "
056                    + moreLessLimitInt + ");return false;", null);
057            writer.writeAttribute("class", "nx-less-more-ctrl nx-more", null);
058            writer.write(ComponentUtils.translate(context, "label.vocabulary.more"));
059            writer.endElement("a");
060
061            writer.startElement("a", component);
062            writer.writeAttribute("href", "#", null);
063            writer.writeAttribute("onclick", "nuxeo.utils.moreLessTableRows('" + component.getClientId() + "', false, "
064                    + moreLessLimitInt + ");return false;", null);
065            writer.writeAttribute("class", "nx-less-more-ctrl nx-less", null);
066            writer.write(ComponentUtils.translate(context, "label.vocabulary.less"));
067            writer.endElement("a");
068
069            writer.startElement("script", component);
070            writer.write("jQuery(document).ready(function(){nuxeo.utils.moreLessTableRows('" + component.getClientId()
071                    + "', false, " + moreLessLimitInt + ");});");
072            writer.endElement("script");
073        }
074
075        Iterator<SelectItem> items = RenderKitUtils.getSelectItems(context, component);
076        if (!items.hasNext()) {
077            final String emptyChoiceMessage = (String) component.getAttributes().get(EMPTY_CHOICE_PROPERTY);
078            if (StringUtils.isNotBlank(emptyChoiceMessage)) {
079                ResponseWriter writer = context.getResponseWriter();
080                writer.startElement("div", component);
081                writer.writeAttribute("class", "emptyResult", null);
082                writer.write(ComponentUtils.translate(context, emptyChoiceMessage));
083                writer.endElement("div");
084            }
085        }
086    }
087
088}