/******************************************************************************* * 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 * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.jsf.vpe.richfaces.template; import java.util.ArrayList; import java.util.List; import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil; import org.jboss.tools.vpe.editor.template.expression.VpeExpression; import org.jboss.tools.vpe.editor.template.expression.VpeExpressionBuilder; import org.jboss.tools.vpe.editor.template.expression.VpeExpressionBuilderException; import org.jboss.tools.vpe.editor.util.Constants; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * contain rich faces tags and general attributes. * * @author Sergey Dzmitrovich */ public class RichFaces { /** * The Constructor. */ private RichFaces() { } public static final String ATTR_ADD_CONTROL_LABEL = "addControlLabel"; //$NON-NLS-1$ public static final String ATTR_ALIGN = "align"; //$NON-NLS-1$ public static final String ATTR_BREAK_BEFORE = "breakBefore"; //$NON-NLS-1$ public static final String ATTR_BREAK_ROW_BEFORE = "breakRowBefore"; // RichFaces 4.0 attribute //$NON-NLS-1$ public static final String ATTR_CAPTION_CLASS = "captionClass"; //$NON-NLS-1$ public static final String ATTR_CAPTION_STYLE = "captionStyle"; //$NON-NLS-1$ public static final String ATTR_COLLAPSE_ICON = "collapseIcon"; //$NON-NLS-1$ public static final String ATTR_COLLAPSE_LABEL = "collapseLabel"; //$NON-NLS-1$ public static final String ATTR_COLUMN_CLASSES = "columnClasses"; //$NON-NLS-1$ public static final String ATTR_COLUMNS = "columns"; //$NON-NLS-1$ public static final String ATTR_COLUMNS_WIDTH = "columnsWidth"; //$NON-NLS-1$ public static final String ATTR_BUTTON_ICON = "buttonIcon"; //$NON-NLS-1$ public static final String ATTR_BUTTON_ICON_DISABLED = "buttonIconDisabled"; //$NON-NLS-1$ public static final String ATTR_BUTTON_CLASS = "buttonClass"; //$NON-NLS-1$ public static final String ATTR_SHOW_INPUT = "showInput"; //$NON-NLS-1$ public static final String ATTR_LOCALE = "locale"; //$NON-NLS-1$ public static final String ATTR_CONTROLS_TYPE = "controlsType"; //$NON-NLS-1$ public static final String ATTR_DEFAULT_LABEL = "defaultLabel"; //$NON-NLS-1$ public static final String ATTR_LABEL = "label"; //$NON-NLS-1$ public static final String ATTR_DIRECTION = "direction"; //$NON-NLS-1$ public static final String ATTR_JOINT_POINT = "jointPoint"; //$NON-NLS-1$ public static final String ATTR_DISABLED = "disabled";//$NON-NLS-1$ public static final String ATTR_ELEMENTS = "elements"; //$NON-NLS-1$ public static final String ATTR_HEADER_CLASS = "headerClass"; //$NON-NLS-1$ public static final String ATTR_BODY_CLASS = "bodyClass"; //$NON-NLS-1$ public static final String ATTR_FOOTER_CLASS = "footerClass"; //$NON-NLS-1$ public static final String ATTR_INPUT_CLASS = "inputClass"; //$NON-NLS-1$ public static final String ATTR_INPUT_SIZE = "inputSize"; //$NON-NLS-1$ public static final String ATTR_INPUT_STYLE = "inputStyle"; //$NON-NLS-1$ public static final String ATTR_LIST_HEIGHT = "listHeight"; //$NON-NLS-1$ public static final String ATTR_LIST_WIDTH = "listWidth"; //$NON-NLS-1$ public static final String ATTR_NAME = "name"; //$NON-NLS-1$ public static final String ATTR_POPUP = "popup";//$NON-NLS-1$ public static final String ATTR_ROWS = "rows"; //$NON-NLS-1$ public static final String ATTR_ROW_CLASS = "rowClass"; //$NON-NLS-1$ public static final String ATTR_ROW_CLASSES = "rowClasses"; //$NON-NLS-1$ public static final String ATTR_SELECT_ITEM_LABEL = "itemLabel"; //$NON-NLS-1$ public static final String ATTR_SELECT_ITEM_VALUE = "itemValue"; //$NON-NLS-1$showButton public static final String ATTR_SHOW_BUTTON = "showButton"; //$NON-NLS-1$ public static final String ATTR_SHOW_BUTTON_LABELS = "showButtonLabels"; //$NON-NLS-1$ public static final String ATTR_SORT_BY = "sortBy"; //$NON-NLS-1$ public static final String ATTR_SORT_ICON = "sortIcon"; //$NON-NLS-1$ public static final String ATTR_SORTABLE = "sortable"; //$NON-NLS-1$ public static final String ATTR_STYLE = "style"; //$NON-NLS-1$ public static final String ATTR_STYLE_CLASS = "styleClass"; //$NON-NLS-1$ public static final String ATTR_TYPE = "type"; //$NON-NLS-1$ public static final String ATTR_VALUE = "value"; //$NON-NLS-1$ public static final String ATTR_VISIBLE = "visible"; //$NON-NLS-1$ public static final String ATTR_WIDTH = "width"; //$NON-NLS-1$ public static final String ATTR_HEIGHT = "height"; //$NON-NLS-1$ public static final String ATTR_HORIZONTAL_OFFSET = "horizontalOffset"; //$NON-NLS-1$ public static final String ATTR_VERTICAL_OFFSET = "verticalOffset"; //$NON-NLS-1$ public static final String ATTR_ZINDEX = "zindex"; //$NON-NLS-1$ public static final String ATTR_POSITION = "position"; //$NON-NLS-1$ /** FACETS NAMES **/ public static final String NAME_FACET_LABEL = "label"; //$NON-NLS-1$ public static final String NAME_FACET_CAPTION = "caption"; //$NON-NLS-1$ public static final String NAME_FACET_FOOTER = "footer"; //$NON-NLS-1$ public static final String NAME_FACET_HEADER = "header"; //$NON-NLS-1$ public static final String NAME_FACET_TERM = "term"; //$NON-NLS-1$ public static final String NAME_FACET_CONTROLS = "controls"; //$NON-NLS-1$ /** jsf tags which are used with richFaces. */ public static final String TAG_COLUMN = "column"; //$NON-NLS-1$ public static final String TAG_COLUMN_GROUP = "columnGroup"; //$NON-NLS-1$ public static final String TAG_COLUMNS = "columns"; //$NON-NLS-1$ public static final String TAG_FACET = "facet"; //$NON-NLS-1$ public static final String TAG_SUB_TABLE = "subTable"; //$NON-NLS-1$ public static final String VALUE_TRUE = "true"; //$NON-NLS-1$ public static final String VALUE_FALSE = "false"; //$NON-NLS-1$ public static final String VALUE_LEFT = "left"; //$NON-NLS-1$ public static final String VALUE_RIGHT = "right"; //$NON-NLS-1$ public static final String VALUE_TOP = "top"; //$NON-NLS-1$ public static final String VALUE_BOTTOM = "bottom"; //$NON-NLS-1$ public static final String VALUE_CENTER = "center"; //$NON-NLS-1$ public static final String COLLAPSED_STATE = "collapsedState"; private static VpeExpression exprColumnClasses = null; /** * Returns the expression to extract style-classes from a {@code 'columnClasses'} attribute. */ public static VpeExpression getExprColumnClasses() { if (exprColumnClasses == null) { try { exprColumnClasses = VpeExpressionBuilder .buildCompletedExpression("{@" + ATTR_COLUMN_CLASSES + "}", true) //$NON-NLS-1$ //$NON-NLS-2$ .getExpression(); } catch (VpeExpressionBuilderException e) { throw new RuntimeException(e); } } return exprColumnClasses; } private static VpeExpression exprRowClasses = null; /** * Returns the expression to extract style-classes from a {@code 'rowClasses'} attribute. */ public static VpeExpression getExprRowClasses() { if (exprRowClasses == null) { try { exprRowClasses = VpeExpressionBuilder .buildCompletedExpression("{@" + ATTR_ROW_CLASSES + "}", true) //$NON-NLS-1$ //$NON-NLS-2$ .getExpression(); } catch (VpeExpressionBuilderException e) { throw new RuntimeException(e); } } return exprRowClasses; } public static List<Element> findElementsById(Element root, String id, String tagName) { ArrayList<Element> list = new ArrayList<Element>(); NodeList nodeList = root.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node child = nodeList.item(i); if (child instanceof Element) { Element childElement = (Element) child; if (childElement.getNodeName().endsWith(tagName) && id.equals(childElement.getAttribute("id"))) { //$NON-NLS-1$ list.add(childElement); } list.addAll(findElementsById(childElement, id, tagName)); } } return list; } /** * Reads COLLAPSED_STATE attribute's value from the source node * * @param sourceNode the verifiable source node * @return true, if node is collapsed */ public static boolean readCollapsedStateFromSourceNode(Node sourceNode) { boolean isCollapsed = false; String collapsedState = (String) sourceNode.getUserData(COLLAPSED_STATE); if ((collapsedState != null) && ("true".equalsIgnoreCase(collapsedState))){ //$NON-NLS-1$ isCollapsed = true; } return isCollapsed; } public static ArrayList<Element> getColumns(Node parentSourceElement) { ArrayList<Element> columns = new ArrayList<Element>(); NodeList children = parentSourceElement.getChildNodes(); for(int i=0; i<children.getLength(); i++) { Node child = children.item(i); String nodeName = child.getNodeName(); if((child instanceof Element) && (nodeName.endsWith(TAG_COLUMN) || nodeName.endsWith(TAG_COLUMNS))) { columns.add((Element)child); } } return columns; } /** * Returns true if and only if {@code columns} contains at least one column that have facet * with given {@code facetName}. */ public static boolean hasColumnWithFacet(ArrayList<Element> columns, String facetName) { for (Element column : columns) { Node body = ComponentUtil.getFacet(column, facetName, true); if(body!=null) { return true; } } return false; } public static int getColumnsCount(Element sourceElement, ArrayList<Element> columns) { int count = 0; // check for exact value in component try { count = Integer.parseInt(sourceElement.getAttribute(ATTR_COLUMNS)); } catch (NumberFormatException e) { count = calculateRowColumns(sourceElement, columns); } return count; } /* * Calculate max number of columns per row. * For rows, recursive calculate max length. */ public static int calculateRowColumns(Element sourceElement, ArrayList<Element> columns) { int count = 0; int currentLength = 0; for (Element column : columns) { if (ComponentUtil.isRendered(column)) { String nodeName = column.getNodeName(); if (nodeName.endsWith(TAG_COLUMN_GROUP)) { // Store max calculated value of previous rows. count = Math.max(currentLength,count); // Calculate number of columns in row. currentLength = calculateRowColumns(sourceElement, getColumns(column)); // Store max calculated value count = Math.max(currentLength,count); currentLength = 0; } else if (nodeName.equals(sourceElement.getPrefix() + Constants.COLON + TAG_COLUMN) || nodeName.equals(sourceElement.getPrefix() + Constants.COLON + TAG_COLUMNS)) { // For new row, save length of previous. if (RichFacesColumnTemplate.isBreakBefore(column)) { count = Math.max(currentLength,count); currentLength = 0; } String colspanStr = column.getAttribute("colspan"); //$NON-NLS-1$ try { currentLength += Integer.parseInt(colspanStr); } catch (NumberFormatException e) { currentLength++; } } else if (nodeName.endsWith(TAG_COLUMN)) { // UIColumn always have colspan == 1. currentLength++; } } } return Math.max(currentLength, count); } }