nl.intercommit.weaves.mixins.Bootstrap.java Source code

Java tutorial

Introduction

Here is the source code for nl.intercommit.weaves.mixins.Bootstrap.java

Source

/*  Copyright 2014 InterCommIT b.v.
*
*  This file is part of the "Weaves" project hosted on https://github.com/intercommit/Weaves
*
*  Weaves is free software: you can redistribute it and/or modify
*  it under the terms of the GNU Lesser General Public License as published by
*  the Free Software Foundation, either version 3 of the License, or
*  any later version.
*
*  Weaves is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU Lesser General Public License for more details.
*
*  You should have received a copy of the GNU Lesser General Public License
*  along with Weaves.  If not, see <http://www.gnu.org/licenses/>.
*
*/
package nl.intercommit.weaves.mixins;

import javax.inject.Inject;

import nl.intercommit.weaves.services.IBootstrapElementConfig;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.SetupRender;
import org.apache.tapestry5.dom.Element;
import org.apache.tapestry5.func.Predicate;
import org.slf4j.Logger;

/**
 * Renders tapestry elements in Bootstrap 3.x style
 * 
 * @tapestrydoc
 *
 */
public class Bootstrap {

    private static final String[] NON_STYLABLE = { "option", "p", "br", "img", "dt", "dd", "tr", "td" };

    private int labelSize;
    private int inputSize;

    @Parameter(required = false, value = "2", defaultPrefix = "literal")
    private String formLabelSize;

    @Inject
    private Logger logger;

    @Inject
    private IBootstrapElementConfig config;

    @SetupRender
    void init() {
        labelSize = Integer.parseInt(formLabelSize);
        inputSize = 12 - labelSize;
    }

    void afterRenderTemplate(MarkupWriter writer) {
        writer.getElement().getElement(new Predicate<Element>() {

            @Override
            public boolean accept(Element arg0) {

                final String elementName = arg0.getName();
                final String inputType = arg0.getAttribute("type");
                final String className = arg0.getAttribute("class");

                // quickly skip some non-styleable stuff
                if (ArrayUtils.contains(NON_STYLABLE, elementName)) {
                    return false;
                }
                if (logger.isDebugEnabled()) {
                    logger.debug("Styling element [" + elementName + "] with type [" + inputType + "] and class ["
                            + className + "] ");
                }
                // Use JAVA7 features.
                switch (elementName) {
                case "form": {
                    arg0.addClassName(config.getElementClassMapping().get("form"));
                    break;
                }
                case "dl": {
                    arg0.addClassName("dl-horizontal");
                    break;
                }
                case "label": {
                    arg0.addClassName("control-label");
                    if (StringUtils.contains(arg0.getContainer().getAttribute("class"), "form-group")) {
                        arg0.addClassName("col-lg-" + labelSize);
                    }
                    break;
                }
                case "input": {
                    if (inputType != null) {
                        if ("text".equals(inputType)) {
                            arg0.addClassName("form-control"); // inputtext
                        } else if ("submit".equals(inputType)) {
                            arg0.addClassName("btn"); // submit
                        } else if ("password".equals(inputType)) {
                            arg0.addClassName("form-control"); // password
                        }
                    } else {
                        arg0.addClassName("form-control"); // regular control
                    }
                    if (StringUtils.contains(arg0.getContainer().getAttribute("class"), "form-group")) {
                        arg0.wrap("div", "class", "col-lg-" + inputSize);
                    }
                    break;
                }
                case "select": {
                    arg0.addClassName("form-control");
                    if (StringUtils.contains(arg0.getContainer().getAttribute("class"), "form-group")) {
                        arg0.wrap("div", "class", "col-lg-" + inputSize);
                    }
                    break;
                }
                case "textarea": {
                    arg0.addClassName("form-control");
                    if (StringUtils.contains(arg0.getContainer().getAttribute("class"), "form-group")) {
                        arg0.wrap("div", "class", "col-lg-" + inputSize);
                    }
                    break;
                }
                case "div": {
                    if ("t-beaneditor-row".equals(className)) {
                        arg0.addClassName("form-group");
                    } else if ("t-error".equals(className)) {
                        arg0.addClassName("alert alert-danger");
                    } else if ("input-group".equals(className)) {
                        arg0.addClassName("col-lg-" + inputSize);
                    }
                    break;
                }
                case "table": {
                    arg0.addClassName("table");
                    break;
                }
                }
                return false;
            }
        });

    }
}