org.jboss.ballroom.client.widgets.forms.DefaultGroupRenderer.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.ballroom.client.widgets.forms.DefaultGroupRenderer.java

Source

/*
 * JBoss, Home of Professional Open Source
 * Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors
 * as indicated by the @author tags. All rights reserved.
 * See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU Lesser General Public License, v. 2.1.
 * This program is distributed in the hope that it will be useful, but WITHOUT A
 * 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,
 * v.2.1 along with this distribution; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA  02110-1301, USA.
 */

package org.jboss.ballroom.client.widgets.forms;

import com.google.gwt.dom.client.Element;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Widget;

import java.util.ArrayList;
import java.util.Map;

/**
 * The default renderer for a group of form items.
 *
 * @see Form
 *
 * @author Heiko Braun
 * @author David Bosschaert
 * @date 3/3/11
 */
public class DefaultGroupRenderer implements GroupRenderer {
    private final String id = "form-" + DOM.createUniqueId() + "_";
    private final String tablePrefix = "<table class='form-item-table' border=0 id='" + id
            + "' border=0 cellpadding=0 cellspacing=0 role='presentation'>";
    private final static String tableSuffix = "</table>";

    @Override
    public Widget render(RenderMetaData metaData, String groupName, Map<String, FormItem> groupItems) {
        SafeHtmlBuilder builder = new SafeHtmlBuilder();
        builder.appendHtmlConstant(tablePrefix);

        // build html structure
        ArrayList<String> itemKeys = new ArrayList<String>(groupItems.keySet());
        ArrayList<FormItem> values = new ArrayList<FormItem>(groupItems.values());

        // Remove the hidden items from both lists. Iterate from the back so that removal doesn't
        // require adjustment of the numbering.
        for (int i = values.size() - 1; i >= 0; i--) {
            if (!values.get(i).render()) {
                values.remove(i);
                itemKeys.remove(i);
            }
        }

        //int colWidth = 100/(metaData.getNumColumns()*2);

        int numColumns = metaData.getNumColumns();
        builder.appendHtmlConstant("<colgroup class='cols_" + numColumns + "'>");
        for (int col = 0; col < numColumns; col++) {
            // it's two TD's per item (title & value)
            builder.appendHtmlConstant("<col class='form-item-title-col'/>");
            builder.appendHtmlConstant("<col class='form-item-col'/>");

        }
        builder.appendHtmlConstant("</colgroup>");

        int i = 0;
        while (i < itemKeys.size()) {
            builder.appendHtmlConstant(
                    "<tr class='form-attribute-row' data-dmr-attr='" + values.get(i).getName() + "'>"); // TODO only works with single column

            int col = 0;
            for (col = 0; col < numColumns; col++) {
                int next = i + col;
                if (next < itemKeys.size()) {
                    FormItem item = values.get(next);
                    createItemCell(metaData, builder, itemKeys.get(next), item);
                } else {
                    break;
                }
            }

            builder.appendHtmlConstant("</tr>");
            i += col;
        }

        builder.appendHtmlConstant(tableSuffix);
        builder.appendHtmlConstant(
                "<p style='color:#999999;padding-left:8px'> Required fields are marked with an asterisk (<abbr class='req' title='required'>*</abbr>).</p>");

        HTMLPanel panel = new HTMLPanel(builder.toSafeHtml());

        // inline widget
        for (String key : itemKeys) {
            FormItem item = groupItems.get(key);
            final String widgetId = id + key;
            final String labelId = id + key + "_l"; // aria property key
            final String insertId = id + key + "_i";

            Element input = item.getInputElement();
            if (input != null) {
                input.setAttribute("id", widgetId);
                //widget.getElement().setAttribute("tabindex", "0");
                input.setAttribute("aria-labelledby", labelId);
                input.setAttribute("aria-required", String.valueOf(item.isRequired()));
            }
            panel.add(item.asWidget(), insertId);

        }

        return panel;
    }

    private void createItemCell(RenderMetaData metaData, SafeHtmlBuilder builder, String key, FormItem item) {

        final String labelId = id + key + "_l"; // aria property key

        final String widgetId = id + key;
        final String insertId = id + key + "_i";

        builder.appendHtmlConstant("<td class='form-item-title'>"); // style='width:"+metaData.getTitleWidth()*5+"pt'
        String text = !item.getTitle().isEmpty() ? item.getTitle() : "";
        builder.appendHtmlConstant("<label for='" + widgetId + "' id='" + labelId + "'>");
        builder.appendEscaped(text);
        if (item.isRequired()) {
            builder.appendHtmlConstant("<abbr class=\"req\" title=\"required\">*</abbr>");
        }

        if (!item.getTitle().isEmpty())
            builder.appendHtmlConstant(":");
        builder.appendHtmlConstant("</label>");
        builder.appendHtmlConstant("</td>");

        builder.appendHtmlConstant("<td class='form-item form-item-value' id='" + insertId + "'>")
                .appendHtmlConstant("</td>");
        // contents added later
        builder.appendHtmlConstant("</td>");
    }

    @Override
    public Widget renderPlain(RenderMetaData metaData, String groupName, PlainFormView plainView) {
        return plainView.asWidget(metaData);
    }
}