/******************************************************************************* * Copyright (c) 2007 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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 * * Contributor: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.jsf.vpe.jsf.template; import static org.jboss.tools.vpe.xulrunner.util.XPCOM.queryInterface; import org.jboss.tools.jsf.vpe.jsf.template.selectitem.AbstractRadioSelectItemTemplate; import org.jboss.tools.vpe.editor.context.VpePageContext; import org.jboss.tools.vpe.editor.template.VpeAbstractTemplate; import org.jboss.tools.vpe.editor.template.VpeChildrenInfo; import org.jboss.tools.vpe.editor.template.VpeCreationData; import org.jboss.tools.vpe.editor.util.HTML; import org.mozilla.interfaces.nsIDOMDocument; import org.mozilla.interfaces.nsIDOMElement; import org.mozilla.interfaces.nsIDOMNode; import org.mozilla.interfaces.nsIDOMNodeList; import org.mozilla.xpcom.XPCOMException; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * Class for creating selectOneRadio template * * @author Dzmitry Sakovich (dsakovich@exadel.com) * */ public class JsfSelectOneRadioTemplate extends VpeAbstractTemplate { private static final String VAL_PAGE_DIRECTION = "pageDirection"; //$NON-NLS-1$ private static final String ATTR_LAYOUT = "layout"; //$NON-NLS-1$ private static final String ATTR_BORDER = "border"; //$NON-NLS-1$ private static final String ATTR_DISABLED_CLASS = "disabledClass"; //$NON-NLS-1$ private static final String ATTR_ENABLED_CLASS = "enabledClass"; //$NON-NLS-1$ private static final String ATTR_STYLE_CLASS = "styleClass"; //$NON-NLS-1$ private static final String ATTR_DIR_RIGHT_TO_LEFT = "rtl"; //$NON-NLS-1$ private static final String ATTR_DIR_LEFT_TO_RIGHT = "ltr"; //$NON-NLS-1$ private static final String ATTR_DISABLED_VALUE = "disabled"; //$NON-NLS-1$ public JsfSelectOneRadioTemplate() { super(); } public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { Element sourceElement = (Element) sourceNode; boolean layoutHorizontal = true; String layout = sourceElement.getAttribute(ATTR_LAYOUT); layoutHorizontal = !VAL_PAGE_DIRECTION.equalsIgnoreCase(layout); nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV); nsIDOMElement visualTable = visualDocument.createElement(HTML.TAG_TABLE); div.appendChild(visualTable); VpeCreationData creatorInfo = new VpeCreationData(div); visualTable.setAttribute(HTML.ATTR_CLASS, ComponentUtil.getAttribute( sourceElement, ATTR_STYLE_CLASS)); visualTable.setAttribute(HTML.ATTR_STYLE, ComponentUtil.getAttribute( sourceElement, HTML.ATTR_STYLE)); if (sourceElement.hasAttribute(ATTR_BORDER)) { String border = sourceElement.getAttribute(ATTR_BORDER); visualTable.setAttribute(ATTR_BORDER, border); } NodeList children = sourceNode.getChildNodes(); int count = children != null ? children.getLength() : 0; if (count > 0) { Node[] sourceChildren = new Node[count]; int childrenCount = 0; for (int i = 0; i < count; i++) { Node node = children.item(i); int type = node.getNodeType(); if (type == Node.ELEMENT_NODE || type == Node.TEXT_NODE && node.getNodeValue().trim().length() > 0) { sourceChildren[childrenCount] = node; childrenCount++; } } if (childrenCount > 0) { int rowCount; int rowLength; int tableSize = childrenCount; if (layoutHorizontal) { rowCount = (childrenCount + tableSize - 1) / tableSize; rowLength = tableSize; } else { rowCount = tableSize; rowLength = (childrenCount + tableSize - 1) / tableSize; } for (int i = 0; i < rowCount; i++) { nsIDOMElement visualRow = visualDocument .createElement(HTML.TAG_TR); for (int j = 0; j < rowLength; j++) { nsIDOMElement visualCell = visualDocument .createElement(HTML.TAG_TD); visualRow.appendChild(visualCell); int sourceIndex = layoutHorizontal ? rowLength * i + j : rowCount * j + i; if (sourceIndex < childrenCount) { VpeChildrenInfo childrenInfo = new VpeChildrenInfo( visualCell); childrenInfo .addSourceChild(sourceChildren[sourceIndex]); creatorInfo.addChildrenInfo(childrenInfo); } } visualTable.appendChild(visualRow); } } } return creatorInfo; } @Override public void validate(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument, VpeCreationData data) { if (data.getNode() != null) { applyChildAttributes((Element) sourceNode, data.getNode()); } } private void applyChildAttributes(Element sourceElement, nsIDOMNode node) { boolean disabled = false; try { nsIDOMNodeList list = node.getChildNodes(); nsIDOMElement element = queryInterface(node, nsIDOMElement.class); disabled = ComponentUtil.string2boolean(ComponentUtil.getAttribute( sourceElement, HTML.ATTR_DISABLED)); if (node.getNodeName().equalsIgnoreCase(HTML.TAG_INPUT)) { element .setAttribute( HTML.ATTR_DIR, (ComponentUtil.getAttribute(sourceElement, HTML.ATTR_DIR).trim() .equalsIgnoreCase(ATTR_DIR_RIGHT_TO_LEFT)) ? ATTR_DIR_RIGHT_TO_LEFT : ((ComponentUtil.getAttribute( sourceElement, HTML.ATTR_DIR) .trim() .equalsIgnoreCase(ATTR_DIR_LEFT_TO_RIGHT)) ? ATTR_DIR_LEFT_TO_RIGHT : "")); //$NON-NLS-1$ element.setAttribute(HTML.ATTR_SIZE, ComponentUtil .getAttribute(sourceElement, HTML.ATTR_SIZE)); if (disabled || ComponentUtil .string2boolean(ComponentUtil .getAttribute( element, AbstractRadioSelectItemTemplate.ITEM_DISABLED))) element.setAttribute(HTML.ATTR_DISABLED, ATTR_DISABLED_VALUE); } if (node.getNodeName().equalsIgnoreCase(HTML.TAG_LABEL)) { element .setAttribute( HTML.ATTR_CLASS, (disabled || ComponentUtil .string2boolean(ComponentUtil .getAttribute( element, AbstractRadioSelectItemTemplate.ITEM_DISABLED))) ? ComponentUtil .getAttribute(sourceElement, ATTR_DISABLED_CLASS) : ComponentUtil.getAttribute( sourceElement, ATTR_ENABLED_CLASS)); } if (node.getNodeName().equalsIgnoreCase(HTML.TAG_TABLE)) { element.setAttribute(HTML.ATTR_STYLE, ComponentUtil .getAttribute(sourceElement, HTML.ATTR_STYLE)); } for (int i = 0; i < list.getLength(); i++) { applyChildAttributes(sourceElement, list.item(i)); } } catch (XPCOMException e) { // Ignore return; } } }