/******************************************************************************* * Copyright (c) 2012 OpenLegacy Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * OpenLegacy Inc. - initial API and implementation *******************************************************************************/ package org.openlegacy.terminal.web.render.support; import org.apache.commons.lang.StringUtils; import org.openlegacy.OpenLegacyProperties; import org.openlegacy.terminal.Color; import org.openlegacy.terminal.TerminalField; import org.openlegacy.terminal.web.render.ElementsProvider; import org.openlegacy.terminal.web.render.HtmlProportionsHandler; import org.openlegacy.utils.StringUtil; import org.openlegacy.web.HtmlConstants; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; import java.text.MessageFormat; import java.util.Map; import javax.inject.Inject; public class DefaultElementsProvider implements ElementsProvider<Element> { @Inject private HtmlProportionsHandler htmlProportionsHandler; private Map<Color, String> colorMapper = null; private Map<Color, String> backcolorMapper = null; private String defaultColor = "green"; private String defaultBackgroundColor = "white"; // usefull for RTL application private boolean renderTopRight = false; @Inject private OpenLegacyProperties openLegacyProperties; public Element createLabel(Element rootNode, TerminalField field) { String value = field.getValue(); if (StringUtils.isWhitespace(value) && field.getBackColor() == Color.BLACK) { return null; } if (field.getBackColor() == Color.BLACK) { value = value.trim(); } Element label = createTag(rootNode, HtmlConstants.SPAN); populateCommonAttributes(label, field); Text textNode = rootNode.getOwnerDocument().createTextNode(value); label.appendChild(textNode); rootNode.appendChild(label); return label; } public Element createTag(Element rootNode, String tagName) { return rootNode.getOwnerDocument().createElement(tagName); } public Element createInput(Element parentTag, TerminalField field) { Element input = createTag(parentTag, HtmlConstants.INPUT); if (field != null) { populateCommonAttributes(input, field); input.setAttribute(HtmlConstants.VALUE, field.getValue()); input.setAttribute(HtmlConstants.MAXLENGTH, String.valueOf(field.getLength())); int width = htmlProportionsHandler.toWidth(field.getLength()) + htmlProportionsHandler.getInputAdditionalWidth(); input.setAttribute(HtmlConstants.STYLE, MessageFormat.format("{0}{1}", input.getAttribute(HtmlConstants.STYLE), HtmlNamingUtil.toStyleWidth(width))); if (field.isRightToLeft()) { // align with HATS bidi-override input.setAttribute(HtmlConstants.STYLE, input.getAttribute(HtmlConstants.STYLE) + ";direction:rtl;unicode-bidi: bidi-override;"); } if (field.isUppercase() || openLegacyProperties.isUppercaseInput()) { // align with HATS bidi-override input.setAttribute(HtmlConstants.STYLE, input.getAttribute(HtmlConstants.STYLE) + ";text-transform:uppercase;"); } String fieldName = HtmlNamingUtil.getFieldName(field); input.setAttribute(HtmlConstants.NAME, fieldName); input.setAttribute(HtmlConstants.ID, fieldName); if (field.isHidden()) { input.setAttribute(HtmlConstants.TYPE, HtmlConstants.PASSWORD); } } parentTag.appendChild(input); return input; } private void populateCommonAttributes(Element element, TerminalField field) { String value = field.getValue(); int top = htmlProportionsHandler.toHeight(field.getPosition().getRow()); int column = 0; String positioningStyle = null; int offset = 0; // default rendering - top/left if (!renderTopRight) { if (!field.isEditable() && value != null) { offset = StringUtil.startOfNonBlank(value); } column = field.getPosition().getColumn(); int left = htmlProportionsHandler.toWidth(offset + column); positioningStyle = MessageFormat.format("top:{0}{2};left:{1}{2};", top, left, HtmlConstants.STYLE_UNIT); } else { int rightOffset = StringUtil.endOfNonBlank(value); column = field.getEndPosition().getColumn(); int right = htmlProportionsHandler.toWidth(80 + rightOffset - column); positioningStyle = MessageFormat.format("top:{0}{2};right:{1}{2};", top, right, HtmlConstants.STYLE_UNIT); } String colorsStyle = toStyleColors(field); element.setAttribute(HtmlConstants.STYLE, positioningStyle + colorsStyle); } public String toStyleColors(TerminalField field) { String color = getColor(field.getColor(), colorMapper, defaultColor); String backcolor = getColor(field.getBackColor(), backcolorMapper, defaultBackgroundColor); String colorStyle = ""; if (color != null) { colorStyle = MessageFormat.format("color:{0};", color); } String backcolorStyle = ""; if (backcolor != null) { backcolorStyle = MessageFormat.format("background-color:{0};", backcolor); } return colorStyle + backcolorStyle; } private static String getColor(Color color, Map<Color, String> colorMapper, String defaultColor) { // Not all fields have color if (color == null) { return defaultColor; } String colorText = null; // if not color mapper is defined or color not found on mapper -> convert host color to HTML style color if (colorMapper == null || colorMapper.get(color) == null) { colorText = color.toString().toLowerCase(); } else { colorText = colorMapper.get(color); } // don't generate color if it equals to the default page color/background color if (colorText.equals(defaultColor)) { return null; } else { return colorText; } } public Element createStyleTag(Element parentTag, String styleSettings) { Document doc = parentTag.getOwnerDocument(); Element styleTag = createTag(parentTag, HtmlConstants.STYLE); styleTag.appendChild(doc.createTextNode(styleSettings)); parentTag.appendChild(styleTag); return styleTag; } public Element createHidden(Element parentTag, String name) { Element element = createInput(parentTag, null); element.setAttribute(HtmlConstants.TYPE, HtmlConstants.HIDDEN); element.setAttribute(HtmlConstants.NAME, name); return element; } public Element createFormTag(Element parentTag, String formActionURL, String formMethod, String formName) { Element formTag = createTag(parentTag, HtmlConstants.FORM); formTag.setAttribute(HtmlConstants.NAME, formName); formTag.setAttribute(HtmlConstants.ID, formName); formTag.setAttribute(HtmlConstants.ACTION, formActionURL); formTag.setAttribute(HtmlConstants.METHOD, formMethod); parentTag.appendChild(formTag); return formTag; } public Element createScriptTag(Element parentTag, String script) { Document doc = parentTag.getOwnerDocument(); Element scriptTag = createTag(parentTag, HtmlConstants.SCRIPT); scriptTag.setAttribute(HtmlConstants.TYPE, HtmlConstants.TEXT_JAVASCRIPT); scriptTag.appendChild(doc.createTextNode(script)); parentTag.appendChild(scriptTag); return scriptTag; } public void setColorMapper(Map<Color, String> colorMapper) { this.colorMapper = colorMapper; } public void setBackcolorMapper(Map<Color, String> backcolorMapper) { this.backcolorMapper = backcolorMapper; } public void setDefaultBackgroundColor(String defaultBackgroundColor) { this.defaultBackgroundColor = defaultBackgroundColor; } public void setDefaultColor(String defaultColor) { this.defaultColor = defaultColor; } public void setRenderTopRight(boolean renderTopRight) { this.renderTopRight = renderTopRight; } }