/******************************************************************************* * 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.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil; 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.jboss.tools.vpe.editor.util.VpeStyleUtil; import org.mozilla.interfaces.nsIDOMDocument; import org.mozilla.interfaces.nsIDOMElement; import org.mozilla.interfaces.nsIDOMText; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @author Sergey Dzmitrovich * */ public class RichFacesListShuttleTemplate extends VpeAbstractTemplate { /** * source caption key */ private static final String SOURCE_CAPTION = "sourceCaption"; //$NON-NLS-1$ /** * target caption key */ private static final String TARGET_CAPTION = "targetCaption"; //$NON-NLS-1$ /** * path to css */ private static final String STYLE_PATH = "shuttle/shuttle.css"; //$NON-NLS-1$ /** * path to img */ private static final String BUTTON_IMG_PATH = "shuttle/button.gif"; //$NON-NLS-1$ /** * path to img */ private static final String HEADER_IMG_PATH = "shuttle/header.gif"; //$NON-NLS-1$ /** * default value of width of box(list) */ private static final String DEFAULT_LIST_WIDTH = "140px"; //$NON-NLS-1$ /** * default value of height of box(list) */ private static final String DEFAULT_LIST_HEIGHT = "140px"; //$NON-NLS-1$ /** * attribute name of width of source list */ private static final String ATTR_SOURCE_LIST_WIDTH = "sourceListWidth"; //$NON-NLS-1$ /** * attribute name of width of target list */ private static final String ATTR_TARGET_LIST_WIDTH = "targetListWidth"; //$NON-NLS-1$ /** * attribute name of height of source list */ private static final String ATTR_LISTS_HEIGHT = "listsHeight"; //$NON-NLS-1$ /** * If this attribute in source node is "false", 'Copy All' and 'Remove All' * controls aren't displayed */ private static final String ATTR_FAST_MOVE_CONTROLS_VIZIBLE = "fastMoveControlsVisible"; //$NON-NLS-1$ /** * If this attribute in source node is "false", 'Top' and 'Bottom' controls * aren't displayed. */ private static final String ATTR_FAST_ORDER_CONTROLS_VIZIBLE = "fastOrderControlsVisible"; //$NON-NLS-1$ /** * If this attribute in source node is "false", 'Copy' and 'Remove' controls * aren't displayed */ private static final String ATTR_MOVE_CONTROLS_VIZIBLE = "moveControlsVisible"; //$NON-NLS-1$ /** * If this attribute in source node is "false", 'Up' and 'Down' controls * aren't displayed. */ private static final String ATTR_ORDER_CONTROLS_VIZIBLE = "orderControlsVisible"; //$NON-NLS-1$ /** * default button align */ private static final String DEFAULT_BUTTON_ALIGN = HTML.VALUE_ALIGN_MIDDLE; /** * Customizes vertically a position of move/copy controls relatively to * lists */ private static final String ATTR_MOVE_CONTROLS_VERTICAL_ALIGN = "moveControlsVerticalAlign"; //$NON-NLS-1$ /** * * Customizes vertically a position of order controls relatively to lists */ private static final String ATTR_ORDER_CONTROLS_VERTICAL_ALIGN = "orderControlsVerticalAlign"; //$NON-NLS-1$ /** * button images */ private static final Map<String, String> buttonImages; static { buttonImages = new HashMap<String, String>(); // images of the first set of buttons buttonImages.put("copyAllControl", "shuttle/arrow_copy_all.gif"); //$NON-NLS-1$ //$NON-NLS-2$ buttonImages.put("copyControl", "shuttle/arrow_copy.gif"); //$NON-NLS-1$ //$NON-NLS-2$ buttonImages.put("removeControl", "shuttle/arrow_remove.gif"); //$NON-NLS-1$ //$NON-NLS-2$ buttonImages.put("removeAllControl", "shuttle/arrow_remove_all.gif"); //$NON-NLS-1$ //$NON-NLS-2$ // images of the second set of buttons buttonImages.put("topControl", "shuttle/arrow_first.gif"); //$NON-NLS-1$ //$NON-NLS-2$ buttonImages.put("upControl", "shuttle/arrow_up.gif"); //$NON-NLS-1$ //$NON-NLS-2$ buttonImages.put("downControl", "shuttle/arrow_down.gif"); //$NON-NLS-1$ //$NON-NLS-2$ buttonImages.put("bottomControl", "shuttle/arrow_last.gif"); //$NON-NLS-1$ //$NON-NLS-2$ } /** * style classes */ private static final Map<String, String> defaultStyleClasses; static { defaultStyleClasses = new HashMap<String, String>(); // general style defaultStyleClasses.put("style", "rich-list-shuttle"); //$NON-NLS-1$ //$NON-NLS-2$ // styles of the lists defaultStyleClasses.put("header", "rich-shuttle-list-header"); //$NON-NLS-1$ //$NON-NLS-2$ defaultStyleClasses.put("headerCell", "rich-shuttle-header-tab-cell"); //$NON-NLS-1$ //$NON-NLS-2$ defaultStyleClasses.put("list", "rich-shuttle-list-content"); //$NON-NLS-1$ //$NON-NLS-2$ // styles of button's block defaultStyleClasses.put("controls", "rich-shuttle-controls"); //$NON-NLS-1$ //$NON-NLS-2$ // styles of the first set of buttons defaultStyleClasses.put("copyAllControl", //$NON-NLS-1$ "rich-shuttle-button rich-shuttle-copyAll"); //$NON-NLS-1$ defaultStyleClasses.put("copyControl", //$NON-NLS-1$ "rich-shuttle-button rich-shuttle-copy"); //$NON-NLS-1$ defaultStyleClasses.put("removeControl", //$NON-NLS-1$ "rich-shuttle-button rich-shuttle-remove"); //$NON-NLS-1$ defaultStyleClasses.put("removeAllControl", //$NON-NLS-1$ "rich-shuttle-button rich-shuttle-removeAll"); //$NON-NLS-1$ // styles of the second set of buttons defaultStyleClasses.put("topControl", //$NON-NLS-1$ "rich-shuttle-button rich-shuttle-top"); //$NON-NLS-1$ defaultStyleClasses.put("upControl", //$NON-NLS-1$ "rich-shuttle-button rich-shuttle-up"); //$NON-NLS-1$ defaultStyleClasses.put("downControl", //$NON-NLS-1$ "rich-shuttle-button rich-shuttle-down"); //$NON-NLS-1$ defaultStyleClasses.put("bottomControl", //$NON-NLS-1$ "rich-shuttle-button rich-shuttle-bottom"); //$NON-NLS-1$ // styles of captions defaultStyleClasses.put(SOURCE_CAPTION, "rich-shuttle-source-caption"); //$NON-NLS-1$ defaultStyleClasses.put(TARGET_CAPTION, "rich-shuttle-target-caption"); //$NON-NLS-1$ // styles of rows defaultStyleClasses.put("sourceRow", "rich-shuttle-source-row"); //$NON-NLS-1$ //$NON-NLS-2$ defaultStyleClasses.put("targetRow", "rich-shuttle-target-row"); //$NON-NLS-1$ //$NON-NLS-2$ // styles of rows defaultStyleClasses.put("columns", ""); //$NON-NLS-1$ //$NON-NLS-2$ } /** * default labels */ private static final Map<String, String> defaultLabels; static { defaultLabels = new HashMap<String, String>(); // values of the first set of buttons defaultLabels.put("copyAllControl", "Copy all"); //$NON-NLS-1$ //$NON-NLS-2$ defaultLabels.put("copyControl", "Copy"); //$NON-NLS-1$ //$NON-NLS-2$ defaultLabels.put("removeControl", "Remove"); //$NON-NLS-1$ //$NON-NLS-2$ defaultLabels.put("removeAllControl", "Remove All"); //$NON-NLS-1$ //$NON-NLS-2$ // images of the second set of buttons defaultLabels.put("topControl", "First"); //$NON-NLS-1$ //$NON-NLS-2$ defaultLabels.put("upControl", "Up"); //$NON-NLS-1$ //$NON-NLS-2$ defaultLabels.put("downControl", "Down"); //$NON-NLS-1$ //$NON-NLS-2$ defaultLabels.put("bottomControl", "Last"); //$NON-NLS-1$ //$NON-NLS-2$ // caption labels defaultLabels.put(SOURCE_CAPTION, ""); //$NON-NLS-1$ defaultLabels.put(TARGET_CAPTION, ""); //$NON-NLS-1$ } /** * "fast move" buttons block */ private static final List<String> fastMoveButtons = Arrays.asList( "copyAllControl", //$NON-NLS-1$ "removeAllControl" //$NON-NLS-1$ ); /** * "move" buttons block */ private static final List<String> moveButtons = Arrays.asList( "copyControl", //$NON-NLS-1$ "removeControl" //$NON-NLS-1$ ); /** * "fast order" buttons block */ private static final List<String> fastOrderButtons = Arrays.asList( "topControl", //$NON-NLS-1$ "bottomControl" //$NON-NLS-1$ ); /** * "order" buttons block */ private static final List<String> orderButtons = Arrays.asList( "upControl", //$NON-NLS-1$ "downControl" //$NON-NLS-1$ ); /** * labels for controls */ private final Map<String, String> labels = new HashMap<String, String>(); /** * source buttons */ private final List<String> sourceButtons = new ArrayList<String>(); /** * target buttons */ private final List<String> targetButtons = new ArrayList<String>(); /** * */ private static final Map<String, String> styleClasses = new HashMap<String, String>(); /** * value of vertical-align attribute for source (copy/remove) buttons */ private String sourceButtonsAlign; /** * value of vertical-align attribute for source (up/down/top/bottom) buttons */ private String targetButtonsAlign; /** * value of height attribute of lists (source/target) */ private String listsHeight; /** * value of width attribute of source list */ private String sourceListsWidth; /** * value of width attribute of target list */ private String targetListsWidth; /** * row style class */ private String rowClass; /** * column style class */ private List<String> columnClasses; /** * facetLabels */ private final Map<String, Node> facetLabels = new HashMap<String, Node>(); /** * */ private boolean isShowButtonLabels; /** * */ public RichFacesListShuttleTemplate() { } @Override public boolean recreateAtAttrChange(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMElement visualNode, Object data, String name, String value) { // TODO Auto-generated method stub return true; } /* * (non-Javadoc) * * @see org.jboss.tools.vpe.editor.template.VpeTemplate#create(org.jboss.tools.vpe.editor.context.VpePageContext, * org.w3c.dom.Node, org.mozilla.interfaces.nsIDOMDocument) */ public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { // cast to Element Element sourceElement = (Element) sourceNode; // prepare data prepareData(sourceElement); ComponentUtil.setCSSLink(pageContext, STYLE_PATH, "shuttle"); //$NON-NLS-1$ // create table element nsIDOMElement basicTable = visualDocument.createElement(HTML.TAG_TABLE); // ComponentUtil.copyAttributes(sourceNode, basicTable); basicTable.setAttribute(HTML.ATTR_CLASS, styleClasses.get("style")); //$NON-NLS-1$ String styleAttr = sourceElement.hasAttribute(RichFaces.ATTR_STYLE) ? sourceElement.getAttribute(RichFaces.ATTR_STYLE) : null; basicTable.setAttribute(HTML.ATTR_STYLE, styleAttr); VpeCreationData creationData = new VpeCreationData(basicTable); creationData.addChildrenInfo(new VpeChildrenInfo(null)); // create caption nsIDOMElement caption = createCaption(visualDocument, creationData); if (caption != null) basicTable.appendChild(caption); // create "tr" tag nsIDOMElement basicTr = visualDocument.createElement(HTML.TAG_TR); // create source box nsIDOMElement sourceBoxTd = visualDocument.createElement(HTML.TAG_TD); nsIDOMElement sourceBox = createBox(visualDocument, creationData, getChildren(sourceNode), "source"); //$NON-NLS-1$ sourceBox.setAttribute(HTML.ATTR_STYLE, VpeStyleUtil.PARAMETER_WIDTH + VpeStyleUtil.COLON_STRING + sourceListsWidth + VpeStyleUtil.SEMICOLON_STRING + VpeStyleUtil.PARAMETER_HEIGHT + VpeStyleUtil.COLON_STRING + listsHeight + VpeStyleUtil.SEMICOLON_STRING); sourceBoxTd.appendChild(sourceBox); // create source buttons nsIDOMElement sourceButtonsTd = visualDocument .createElement(HTML.TAG_TD); nsIDOMElement sourceButtonsBlock = createButtonsBlock(visualDocument, creationData, sourceButtons); sourceButtonsTd.appendChild(sourceButtonsBlock); // set vertical-align attribute for source buttons sourceButtonsTd.setAttribute(HTML.ATTR_STYLE, VpeStyleUtil.PARAMETR_VERTICAL_ALIGN + VpeStyleUtil.COLON_STRING + sourceButtonsAlign); // create target box nsIDOMElement targetBoxTd = visualDocument.createElement(HTML.TAG_TD); nsIDOMElement targetBox = createBox(visualDocument, creationData, getChildren(sourceNode), "target"); //$NON-NLS-1$ targetBox.setAttribute(HTML.ATTR_STYLE, VpeStyleUtil.PARAMETER_WIDTH + VpeStyleUtil.COLON_STRING + targetListsWidth + VpeStyleUtil.SEMICOLON_STRING + VpeStyleUtil.PARAMETER_HEIGHT + VpeStyleUtil.COLON_STRING + listsHeight + VpeStyleUtil.SEMICOLON_STRING); targetBoxTd.appendChild(targetBox); // create target buttons nsIDOMElement targetButtonsTd = visualDocument .createElement(HTML.TAG_TD); nsIDOMElement targetButtonsBlock = createButtonsBlock(visualDocument, creationData, targetButtons); targetButtonsTd.appendChild(targetButtonsBlock); // set vertical-align attribute for target buttons targetButtonsTd.setAttribute(HTML.ATTR_STYLE, VpeStyleUtil.PARAMETR_VERTICAL_ALIGN + VpeStyleUtil.COLON_STRING + targetButtonsAlign); // add all blocks to "tr" basicTr.appendChild(sourceBoxTd); basicTr.appendChild(sourceButtonsTd); basicTr.appendChild(targetBoxTd); basicTr.appendChild(targetButtonsTd); // add "tr" to table basicTable.appendChild(basicTr); clearData(); return creationData; } /** * create caption of listShuttle component * * caption is "tr" tag which contain two "td" tags * * @param sourceCaptionLabel * @param targetCaptionLabel * @param visualDocument * @param creationData * @param sourceElement * @return */ private nsIDOMElement createCaption(nsIDOMDocument visualDocument, VpeCreationData creationData) { // check sourceCaptionLabel if ((labels.get(SOURCE_CAPTION).length() == 0) && (!facetLabels.containsKey(SOURCE_CAPTION)) && (labels.get(TARGET_CAPTION).length() == 0) && (!facetLabels.containsKey(TARGET_CAPTION))) return null; // basic element for caption is "tr" tag nsIDOMElement caption = visualDocument.createElement(HTML.TAG_TR); // create source caption label caption.appendChild(createCaptionLabel(visualDocument, creationData, SOURCE_CAPTION)); // create target caption label caption.appendChild(createCaptionLabel(visualDocument, creationData, TARGET_CAPTION)); return caption; } /** * create caption label * * @param visualDocument * @param creationData * @param sourceElement * @param label * @return */ private nsIDOMElement createCaptionLabel(nsIDOMDocument visualDocument, VpeCreationData creationData, String labelId) { // create "td" for target caption label nsIDOMElement captionLabelTd = visualDocument .createElement(HTML.TAG_TD); // set attributes captionLabelTd.setAttribute(HTML.ATTR_COLSPAN, "2"); //$NON-NLS-1$ captionLabelTd.setAttribute(HTML.ATTR_CLASS, styleClasses.get(labelId)); // if facet is defined for this label add facet to "td" if (facetLabels.containsKey(labelId)) { VpeChildrenInfo captionLabelTdInfo = new VpeChildrenInfo( captionLabelTd); creationData.addChildrenInfo(captionLabelTdInfo); captionLabelTdInfo.addSourceChild(facetLabels.get(labelId)); } // add to "td" value of captionLabel else { nsIDOMText captionLabelText = visualDocument.createTextNode(labels .get(labelId)); captionLabelTd.appendChild(captionLabelText); } return captionLabelTd; } /** * create box (list) * * @param visualDocument * @param creationData * @return */ private nsIDOMElement createBox(nsIDOMDocument visualDocument, VpeCreationData creationData, List<Node> children, String boxId) { nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV); div.setAttribute(HTML.ATTR_CLASS, styleClasses.get("list")); //$NON-NLS-1$ // create table element nsIDOMElement box = visualDocument.createElement(HTML.TAG_TABLE); box.setAttribute(HTML.ATTR_CELLSPACING, "0"); //$NON-NLS-1$ box.setAttribute(HTML.ATTR_CELLPADDING, "0"); //$NON-NLS-1$ box.setAttribute(HTML.ATTR_WIDTH, "100%"); //$NON-NLS-1$ // box.setAttribute("height", listsHeight); nsIDOMElement header = createHeader(visualDocument, creationData, children); if (header != null) box.appendChild(header); // create body for box nsIDOMElement tr = visualDocument.createElement(HTML.TAG_TR); tr.setAttribute(HTML.ATTR_STYLE, VpeStyleUtil.PARAMETR_VERTICAL_ALIGN + VpeStyleUtil.COLON_STRING + HTML.VALUE_ALIGN_TOP); tr.setAttribute(HTML.ATTR_CLASS, styleClasses.get(boxId + "Row") + " " //$NON-NLS-1$ //$NON-NLS-2$ + rowClass); // VpeChildrenInfo trInfo = new VpeChildrenInfo(tr); // creationData.addChildrenInfo(trInfo); // add children to "tr" element int columnCount = 0; for (Node child : children) { if (child.getNodeType() == Node.ELEMENT_NODE) { String localName = child.getLocalName(); if (RichFaces.TAG_COLUMN.equals(localName) || RichFaces.TAG_COLUMNS.equals(localName)) { nsIDOMElement column = visualDocument .createElement(HTML.TAG_TD); tr.appendChild(column); if (columnClasses.size() > 0) { String columnClass = columnClasses.get(columnCount % columnClasses.size()); column.setAttribute(HTML.ATTR_CLASS, columnClass); } nsIDOMElement columnTable = visualDocument .createElement(HTML.TAG_TABLE); column.appendChild(columnTable); nsIDOMElement columnTableTr = visualDocument .createElement(HTML.TAG_TR); columnTable.appendChild(columnTableTr); VpeChildrenInfo columnTableTrInfo = new VpeChildrenInfo( columnTableTr); creationData.addChildrenInfo(columnTableTrInfo); columnTableTrInfo.addSourceChild(child); columnCount++; // trInfo.addSourceChild(child); } } } // add "tr" to table box.appendChild(tr); div.appendChild(box); return div; } /** * create buttons block * * @param visualDocument * @param creationData * @param buttonNames * @return */ private nsIDOMElement createButtonsBlock(nsIDOMDocument visualDocument, VpeCreationData creationData, List<String> buttonNames) { // create "div" nsIDOMElement buttonsBlock = visualDocument.createElement(HTML.TAG_DIV); buttonsBlock .setAttribute(HTML.ATTR_CLASS, styleClasses.get("controls")); //$NON-NLS-1$ for (String buttonId : buttonNames) { buttonsBlock.appendChild(createButton(visualDocument, creationData, buttonId)); } return buttonsBlock; } /** * create button * * @param visualDocument * @param creationData * @param buttonValue * @param buttonImage * @return */ private nsIDOMElement createButton(nsIDOMDocument visualDocument, VpeCreationData creationData, String buttonId) { nsIDOMElement buttonSpace = visualDocument.createElement(HTML.TAG_DIV); buttonSpace.setAttribute(HTML.ATTR_CLASS, "rich-shuttle-control"); //$NON-NLS-1$ if (facetLabels.containsKey(buttonId)) { VpeChildrenInfo buttonInfo = new VpeChildrenInfo(buttonSpace); creationData.addChildrenInfo(buttonInfo); buttonInfo.addSourceChild(facetLabels.get(buttonId)); } else { // button represent "div" element nsIDOMElement metaButton = visualDocument .createElement(HTML.TAG_DIV); metaButton.setAttribute(HTML.ATTR_STYLE, ComponentUtil .getBackgoundImgStyle(BUTTON_IMG_PATH)); metaButton .setAttribute(HTML.ATTR_CLASS, "rich-shuttle-meta-button"); //$NON-NLS-1$ // button represent "div" element nsIDOMElement button = visualDocument.createElement(HTML.TAG_DIV); button.setAttribute(HTML.ATTR_CLASS, styleClasses.get(buttonId)); nsIDOMElement buttonContent = visualDocument .createElement(HTML.TAG_DIV); buttonContent.setAttribute(HTML.ATTR_CLASS, "rich-shuttle-button-content"); //$NON-NLS-1$ nsIDOMElement buttonImage = visualDocument .createElement(HTML.TAG_IMG); buttonImage.setAttribute(HTML.ATTR_WIDTH, "15"); //$NON-NLS-1$ buttonImage.setAttribute(HTML.ATTR_HEIGHT, "15"); //$NON-NLS-1$ ComponentUtil.setImg(buttonImage, buttonImages.get(buttonId)); buttonContent.appendChild(buttonImage); if (isShowButtonLabels) { nsIDOMText buttonText = visualDocument.createTextNode(labels .get(buttonId)); buttonContent.appendChild(buttonText); } button.appendChild(buttonContent); metaButton.appendChild(button); buttonSpace.appendChild(metaButton); } return buttonSpace; } /** * prepare data * * @param sourceElement */ private void prepareData(Element sourceElement) { // prepare labels Set<String> labelsKeys = defaultLabels.keySet(); isShowButtonLabels = !"false".equalsIgnoreCase(sourceElement //$NON-NLS-1$ .getAttribute(RichFaces.ATTR_SHOW_BUTTON_LABELS)); for (String key : labelsKeys) { if (sourceElement.hasAttribute(key + "Label")) { //$NON-NLS-1$ String label = sourceElement.getAttribute(key + "Label"); //$NON-NLS-1$ labels.put(key, label); } else labels.put(key, defaultLabels.get(key)); } // prepare style classes Set<String> styleClassesKeys = defaultStyleClasses.keySet(); for (String key : styleClassesKeys) { if (sourceElement.hasAttribute(key + "Class")) { //$NON-NLS-1$ String styleClass = sourceElement.getAttribute(key + "Class"); //$NON-NLS-1$ styleClasses.put(key, defaultStyleClasses.get(key) + " " //$NON-NLS-1$ + styleClass); } else styleClasses.put(key, defaultStyleClasses.get(key)); } // prepare facets for caption and buttons NodeList children = sourceElement.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); if ((child instanceof Element) && (RichFaces.TAG_FACET.equals(child.getLocalName())) && (defaultLabels.containsKey(((Element) child) .getAttribute(RichFaces.ATTR_NAME)))) { facetLabels.put(((Element) child) .getAttribute(RichFaces.ATTR_NAME), child); } } // if attribue exist then if (sourceElement.hasAttribute(RichFaces.ATTR_ROW_CLASSES)) { // get rowClass String rowClasses = sourceElement.getAttribute(RichFaces.ATTR_ROW_CLASSES); rowClass = rowClasses.split("[,;]")[0]; //$NON-NLS-1$ } if (sourceElement.hasAttribute(RichFaces.ATTR_COLUMN_CLASSES)) { String columnClassesAtribute = sourceElement.getAttribute(RichFaces.ATTR_COLUMN_CLASSES); columnClasses = Arrays.asList(columnClassesAtribute.split("[,;]")); //$NON-NLS-1$ } else columnClasses = new ArrayList<String>(); // if "controlsType" attribute is not "none" (if buttons are visible) if (!"none".equalsIgnoreCase(sourceElement //$NON-NLS-1$ .getAttribute(RichFaces.ATTR_CONTROLS_TYPE))) { // prepare source buttons if (!"false".equalsIgnoreCase(sourceElement //$NON-NLS-1$ .getAttribute(ATTR_FAST_MOVE_CONTROLS_VIZIBLE))) sourceButtons.addAll(fastMoveButtons); if (!"false".equalsIgnoreCase(sourceElement //$NON-NLS-1$ .getAttribute(ATTR_MOVE_CONTROLS_VIZIBLE))) sourceButtons.addAll(sourceButtons.size() == 0 ? 0 : 1, moveButtons); // prepare target buttons if (!"false".equalsIgnoreCase(sourceElement //$NON-NLS-1$ .getAttribute(ATTR_FAST_ORDER_CONTROLS_VIZIBLE))) targetButtons.addAll(fastOrderButtons); if (!"false".equalsIgnoreCase(sourceElement //$NON-NLS-1$ .getAttribute(ATTR_ORDER_CONTROLS_VIZIBLE))) targetButtons.addAll(targetButtons.size() == 0 ? 0 : 1, orderButtons); } // prepare buttons attributes sourceButtonsAlign = sourceElement .hasAttribute(ATTR_MOVE_CONTROLS_VERTICAL_ALIGN) ? sourceElement .getAttribute(ATTR_MOVE_CONTROLS_VERTICAL_ALIGN) : DEFAULT_BUTTON_ALIGN; targetButtonsAlign = sourceElement .hasAttribute(ATTR_ORDER_CONTROLS_VERTICAL_ALIGN) ? sourceElement .getAttribute(ATTR_ORDER_CONTROLS_VERTICAL_ALIGN) : DEFAULT_BUTTON_ALIGN; // prepare lists attributes if (sourceElement.hasAttribute(ATTR_LISTS_HEIGHT)) { String listsHeightVal = sourceElement.getAttribute(ATTR_LISTS_HEIGHT); listsHeight = VpeStyleUtil.addPxIfNecessary(listsHeightVal); } else { listsHeight = DEFAULT_LIST_HEIGHT; } if (sourceElement.hasAttribute(ATTR_SOURCE_LIST_WIDTH)) { String listWidthVal = sourceElement.getAttribute(ATTR_SOURCE_LIST_WIDTH); sourceListsWidth = VpeStyleUtil.addPxIfNecessary(listWidthVal); } else { sourceListsWidth = DEFAULT_LIST_WIDTH; } if (sourceElement.hasAttribute(ATTR_TARGET_LIST_WIDTH)) { String listWidthVal = sourceElement.getAttribute(ATTR_TARGET_LIST_WIDTH); targetListsWidth = VpeStyleUtil.addPxIfNecessary(listWidthVal); } else { targetListsWidth = DEFAULT_LIST_WIDTH; } } private void clearData() { labels.clear(); styleClasses.clear(); sourceButtons.clear(); targetButtons.clear(); facetLabels.clear(); } /** * * @param node * @param name * @return */ private Element getNodeFacet(Node node, String name) { NodeList children = node.getChildNodes(); Element facet = null; for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); if ((child instanceof Element) && (RichFaces.TAG_FACET.equals(child.getLocalName())) && (name.equals(((Element) child) .getAttribute(RichFaces.ATTR_NAME)))) { facet = (Element) child; } } return facet; } /** * * @param children * @return */ private boolean haveFacet(List<Node> children, String name) { for (Node node : children) { if (getNodeFacet(node, name) != null) return true; } return false; } /** * * @param visualDocument * @param creationData * @param children * @param id - * "header" or "footer" * @return */ private nsIDOMElement createHeader(nsIDOMDocument visualDocument, VpeCreationData creationData, List<Node> children) { if (!haveFacet(children, "header")) //$NON-NLS-1$ return null; nsIDOMElement header = visualDocument.createElement(HTML.TAG_TR); header.setAttribute(HTML.ATTR_CLASS, styleClasses.get(header)); for (Node child : children) { String localName = child.getLocalName(); if (RichFaces.TAG_COLUMN.equals(localName) || RichFaces.TAG_COLUMNS.equals(localName)) { nsIDOMElement headerCell = visualDocument .createElement(HTML.TAG_TH); headerCell.setAttribute("background", "file:///" //$NON-NLS-1$ //$NON-NLS-2$ + ComponentUtil .getAbsoluteResourcePath(HEADER_IMG_PATH).replace('\\', '/')); // get header classes String headerClass = styleClasses.get("headerCell"); //$NON-NLS-1$ if ((child instanceof Element) && ((Element) child).hasAttribute("headerClass")) { //$NON-NLS-1$ headerClass += " " //$NON-NLS-1$ + ((Element) child).getAttribute("headerClass"); //$NON-NLS-1$ } headerCell.setAttribute(HTML.ATTR_CLASS, headerClass); Element facet = getNodeFacet(child, "header"); //$NON-NLS-1$ if (facet != null) { VpeChildrenInfo headerCellInfo = new VpeChildrenInfo( headerCell); creationData.addChildrenInfo(headerCellInfo); headerCellInfo.addSourceChild(facet); } else { nsIDOMElement pre = visualDocument .createElement(HTML.TAG_PRE); pre.appendChild(visualDocument.createTextNode("")); //$NON-NLS-1$ headerCell.appendChild(pre); } header.appendChild(headerCell); } } return header; } /** * * @param sourceNode * @return */ public static List<Node> getChildren(Node sourceNode) { ArrayList<Node> children = new ArrayList<Node>(); NodeList nodeList = sourceNode.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node child = nodeList.item(i); children.add(child); } return children; } }