All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.larmic.butterfaces.component.renderkit.html_basic.text.TreeBoxRenderer Maven / Gradle / Ivy

/*
 * Copyright Lars Michaelis and Stephan Zerhusen 2016.
 * Distributed under the MIT License.
 * (See accompanying file README.md file or copy at http://opensource.org/licenses/MIT)
 */
package de.larmic.butterfaces.component.renderkit.html_basic.text;

import de.larmic.butterfaces.component.html.text.HtmlTreeBox;
import de.larmic.butterfaces.component.partrenderer.RenderUtils;
import de.larmic.butterfaces.component.renderkit.html_basic.text.model.CachedNodesInitializer;
import de.larmic.butterfaces.component.renderkit.html_basic.text.model.TreeBoxModelType;
import de.larmic.butterfaces.component.renderkit.html_basic.text.model.TreeBoxModelWrapper;
import de.larmic.butterfaces.component.renderkit.html_basic.text.part.TrivialComponentsEntriesNodePartRenderer;
import de.larmic.butterfaces.context.StringHtmlEncoder;
import de.larmic.butterfaces.model.tree.EnumTreeBoxWrapper;
import de.larmic.butterfaces.model.tree.Node;
import de.larmic.butterfaces.resolver.MustacheResolver;
import de.larmic.butterfaces.util.StringUtils;

import javax.faces.component.UIComponent;
import javax.faces.component.UINamingContainer;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.convert.ConverterException;
import javax.faces.render.FacesRenderer;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * @author Lars Michaelis
 */
@FacesRenderer(componentFamily = HtmlTreeBox.COMPONENT_FAMILY, rendererType = HtmlTreeBox.RENDERER_TYPE)
public class TreeBoxRenderer extends AbstractHtmlTagRenderer {

    public static final String DEFAULT_SINGLE_LINE_OF_TEXT_TEMPLATE = "
{{butterObjectToString}}
"; public static final String DEFAULT_SPINNER_TEXT = "Fetching data..."; public static final String DEFAULT_NO_MATCHING_TEXT = "No matching entries..."; @Override protected boolean encodeReadonly() { return false; } @Override public void encodeBegin(FacesContext context, UIComponent component) throws IOException { super.encodeBegin(context, component, "butter-component-treebox"); } @Override protected void encodeEnd(HtmlTreeBox treeBox, ResponseWriter writer) throws IOException { final TreeBoxModelWrapper treeBoxModelWrapper = new TreeBoxModelWrapper(treeBox); final List nodes = treeBoxModelWrapper.getNodes(); final TreeBoxModelType treeBoxModelType = treeBoxModelWrapper.getTreeBoxModelType(); final List mustacheKeys = this.createMustacheKeys(FacesContext.getCurrentInstance(), treeBox); final String clientIdSeparator = String.valueOf(UINamingContainer.getSeparatorChar(FacesContext.getCurrentInstance())); final Map nodesMap = CachedNodesInitializer.createNodesMap(nodes); writer.startElement("script", treeBox); writer.writeText("jQuery(function () {\n", null); writer.writeText("var entries_" + treeBox.getClientId().replace(clientIdSeparator, "_") + " = " + new TrivialComponentsEntriesNodePartRenderer().renderEntriesAsJSON(nodes, mustacheKeys, nodesMap) + ";\n", null); final String jQueryBySelector = RenderUtils.createJQueryBySelector(treeBox.getClientId(), "input"); final String pluginCall = createJQueryPluginCallTrivial(treeBox, treeBoxModelType, mustacheKeys, nodesMap); writer.writeText("var trivialTree" + treeBox.getClientId().replace(clientIdSeparator, "_") + " = " + jQueryBySelector + pluginCall + ";", null); writer.writeText("});", null); writer.endElement("script"); } private List createMustacheKeys(FacesContext context, HtmlTreeBox treeBox) throws IOException { if (treeBox.getFacet("template") != null) { final String encodedTemplate = StringHtmlEncoder.encodeComponentWithSurroundingDiv(context, treeBox.getFacet("template")); return MustacheResolver.getMustacheKeysForTreeNode(encodedTemplate); } return Collections.emptyList(); } @Override protected void encodeInnerEnd(UIComponent component, ResponseWriter writer) throws IOException { final HtmlTreeBox treeBox = (HtmlTreeBox) component; if (treeBox.isReadonly()) { writer.startElement(ELEMENT_DIV, component); writer.writeAttribute("class", "butter-component-value", null); super.encodeSuperEnd(FacesContext.getCurrentInstance(), component); writer.endElement(ELEMENT_DIV); } } @Override public Object getConvertedValue(final FacesContext context, final UIComponent component, final Object submittedValue) throws ConverterException { if (submittedValue == null || "".equals(submittedValue)) { return null; } final String newValue = (String) submittedValue; final HtmlTreeBox treeBox = (HtmlTreeBox) component; final TreeBoxModelWrapper treeBoxModelWrapper = new TreeBoxModelWrapper(treeBox); final TreeBoxModelType treeBoxModelType = treeBoxModelWrapper.getTreeBoxModelType(); final List nodes = treeBoxModelWrapper.getNodes(); final Map nodesMap = CachedNodesInitializer.createNodesMap(nodes); final Integer selectedIndex = Integer.valueOf(newValue); final Node node = nodesMap.get(selectedIndex); return treeBoxModelType == (TreeBoxModelType.OBJECTS) && node != null ? (node.getData() instanceof EnumTreeBoxWrapper ? ((EnumTreeBoxWrapper) node.getData()).getEnumValue() : node.getData()) : node; } private String createJQueryPluginCallTrivial(final HtmlTreeBox treeBox, final TreeBoxModelType treeBoxModelType, final List mustacheKeys, final Map nodesMap) throws IOException { final StringBuilder jQueryPluginCall = new StringBuilder(); final FacesContext context = FacesContext.getCurrentInstance(); final Integer selectedEntryId = this.findValueInCachedNodes(treeBox.getValue(), treeBoxModelType, nodesMap); final Node selectedNode = selectedEntryId != null ? nodesMap.get(selectedEntryId) : null; final String editable = TrivialComponentsEntriesNodePartRenderer.getEditingMode(treeBox); final String noMatchingText = StringUtils.getNotNullValue(treeBox.getNoEntriesText(), DEFAULT_NO_MATCHING_TEXT); final String spinnerText = StringUtils.getNotNullValue(treeBox.getSpinnerText(), DEFAULT_SPINNER_TEXT); if (treeBoxModelType == TreeBoxModelType.OBJECTS) { jQueryPluginCall.append("TrivialComboBox({"); } else { jQueryPluginCall.append("TrivialTreeComboBox({"); } jQueryPluginCall.append("\n allowFreeText: false,"); if (treeBoxModelType == TreeBoxModelType.OBJECTS) { jQueryPluginCall.append("\n valueProperty: 'id',"); } jQueryPluginCall.append("\n inputTextProperty: '" + StringUtils.getNotNullValue(treeBox.getInputTextProperty(), "title") + "',"); if (treeBox.getFacet("emptyEntryTemplate") != null) { jQueryPluginCall.append("\n emptyEntryTemplate: '" + StringHtmlEncoder.encodeComponentWithSurroundingDivIfNecessary(context, treeBox.getFacet("emptyEntryTemplate"), "editor-area") + "',"); } else if (StringUtils.isNotEmpty(treeBox.getPlaceholder())) { jQueryPluginCall.append("\n emptyEntryTemplate: '
" + treeBox.getPlaceholder() + "
',"); } jQueryPluginCall.append("\n editingMode: '" + editable + "',"); if (selectedEntryId != null && selectedNode != null) { jQueryPluginCall.append("\n selectedEntry: " + new TrivialComponentsEntriesNodePartRenderer().renderNode(mustacheKeys, nodesMap, selectedEntryId, selectedNode) + ","); } if (treeBox.getFacet("selectedEntryTemplate") != null) { jQueryPluginCall.append("\n selectedEntryTemplate: '" + StringHtmlEncoder.encodeComponentWithSurroundingDivIfNecessary(context, treeBox.getFacet("selectedEntryTemplate"), "editor-area") + "',"); } if (treeBox.getFacet("template") != null) { final String encodedTemplate = StringHtmlEncoder.encodeComponentWithSurroundingDivIfNecessary(context, treeBox.getFacet("template"), "editor-area"); if (treeBoxModelType == TreeBoxModelType.OBJECTS) { jQueryPluginCall.append("\n template: '" + encodedTemplate + "',"); } else { jQueryPluginCall.append("\n templates: ['" + encodedTemplate + "'],"); } } else if (treeBoxModelType == TreeBoxModelType.NODES) { jQueryPluginCall.append("\n templates: ['" + TreeRenderer.DEFAULT_NODES_TEMPLATE + "'],"); } else if (treeBoxModelType == TreeBoxModelType.OBJECTS) { jQueryPluginCall.append("\n template: '" + DEFAULT_SINGLE_LINE_OF_TEXT_TEMPLATE + "',"); } jQueryPluginCall.append("\n spinnerTemplate: '
" + spinnerText + "
',"); jQueryPluginCall.append("\n noEntriesTemplate: '
" + noMatchingText + "
',"); jQueryPluginCall.append("\n entries: entries_" + treeBox.getClientId().replace(":", "_")); jQueryPluginCall.append("});"); return jQueryPluginCall.toString(); } private Integer findValueInCachedNodes(final Object treeBoxValue, final TreeBoxModelType treeBoxModelType, final Map nodesMap) { if (treeBoxModelType == TreeBoxModelType.OBJECTS && treeBoxValue != null) { for (Integer index : nodesMap.keySet()) { final Node node = nodesMap.get(index); if (node.getData() != null && node.getData().equals(treeBoxValue)) { return index; } } } else if (treeBoxValue != null) { for (Integer index : nodesMap.keySet()) { final Node node = nodesMap.get(index); if (node.equals(treeBoxValue)) { return index; } } } return null; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy