/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.jsf.vpe.richfaces.template; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil; import org.jboss.tools.jsf.vpe.richfaces.HtmlComponentUtil; 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.mozilla.interfaces.nsIDOMDocument; import org.mozilla.interfaces.nsIDOMElement; import org.mozilla.interfaces.nsIDOMNode; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class RichFacesToolBarGroupTemplate extends VpeAbstractTemplate { public static final String TAG_NAME = "toolBarGroup"; //$NON-NLS-1$ public static final String ATTR_ITEMSEPARATOR_NAME = "itemSeparator"; //$NON-NLS-1$ public static final String ATTR_LOCATION_NAME = "location"; //$NON-NLS-1$ public static final String ATTR_LOCATION_RIGHT_VALUE = "right"; //$NON-NLS-1$ private static final String TOOLBAR_PARENT_WARNING = "Parent should be toolBar"; //$NON-NLS-1$ private static final String CSS_DR_TOOLBAR_INT = "dr-toolbar-int"; //$NON-NLS-1$ private static final String CSS_RICH_TOOLBAR_ITEM = "rich-toolbar-item"; //$NON-NLS-1$ private static final String SPACE = " "; //$NON-NLS-1$ private static final String EMPTY = ""; //$NON-NLS-1$ private static final String GROUP_TABLE_STYLE = "border: 0px none; margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px; width: 100%; height: 100%"; //$NON-NLS-1$ private class SourceToolBarGroupItem { private Node toolBarGroupItem; private String itemSeparator; public SourceToolBarGroupItem(Node toolBarGroupItem) { this.toolBarGroupItem = toolBarGroupItem; this.itemSeparator = null; } public SourceToolBarGroupItem(String itemSeparator) { this.toolBarGroupItem = null; this.itemSeparator = itemSeparator; } public Node getToolBarGroupItem() { return toolBarGroupItem; } public String getItemSeparator() { return itemSeparator; } public boolean isItem() { return toolBarGroupItem != null; } } private class SourceToolBarGroupItems { private boolean isToolBarGroupLocationRight; private String itemSeparator; boolean isItemSeparatorExists; private List<SourceToolBarGroupItem> toolBarGroupItems = new ArrayList<SourceToolBarGroupItem>(); public SourceToolBarGroupItems(Node sourceNode, boolean isToolBarGroupLocationRight, String itemSeparator) { this.isToolBarGroupLocationRight = isToolBarGroupLocationRight; this.itemSeparator = itemSeparator; this.isItemSeparatorExists = !(itemSeparator == null || (itemSeparator != null && itemSeparator.length() == 0) || RichFacesToolBarTemplate.ITEM_SEPARATOR_NONE.equals(itemSeparator)); init(sourceNode); } private void init(Node sourceNode) { NodeList childrenList = sourceNode.getChildNodes(); int childrenCount = childrenList.getLength(); boolean isFirstItem = true; for (int i=0; i<childrenCount; i++) { Node child = childrenList.item(i); if (child.getNodeType() == Node.ELEMENT_NODE || isVisibleText(child)) { if (isItemSeparatorExists && isToolBarGroupLocationRight && !isFirstItem) { toolBarGroupItems.add(new SourceToolBarGroupItem(itemSeparator)); } toolBarGroupItems.add(new SourceToolBarGroupItem(child)); if (isItemSeparatorExists && !isToolBarGroupLocationRight && !isLastItem(childrenList, i)) { toolBarGroupItems.add(new SourceToolBarGroupItem(itemSeparator)); } isFirstItem = false; } } } private boolean isVisibleText(Node textNode) { return textNode.getNodeType() == Node.TEXT_NODE && textNode.getNodeValue() != null && textNode.getNodeValue().trim().length() > 0; } private boolean isLastItem(NodeList list, int index) { int listLength = list.getLength(); for (int i=index+1; i < listLength; i++ ) { Node item = list.item(i); if (item.getNodeType() == Node.ELEMENT_NODE || isVisibleText(item)) { return false; } } return true; } public Iterator<SourceToolBarGroupItem> iterator() { return toolBarGroupItems.iterator(); } } public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { nsIDOMElement visualNode = null; VpeCreationData creationData = null; Element sourceElement = (Element)sourceNode; if (!sourceNode.getParentNode().getNodeName().endsWith(":" + RichFacesToolBarTemplate.TAG_NAME)) { //$NON-NLS-1$ visualNode = RichFacesToolBarTemplate.createExceptionNode(visualDocument, TOOLBAR_PARENT_WARNING); creationData = new VpeCreationData(visualNode); } else { String itemSeparator = sourceElement.getAttribute(ATTR_ITEMSEPARATOR_NAME); itemSeparator = RichFacesToolBarTemplate.checkAndUpdateItemSeparatorName(itemSeparator); SourceToolBarGroupItems sourceToolBarGroupItems = new SourceToolBarGroupItems(sourceNode, ATTR_LOCATION_RIGHT_VALUE.equals(sourceElement.getAttribute(ATTR_LOCATION_NAME)), itemSeparator); visualNode = visualDocument.createElement(HtmlComponentUtil.HTML_TAG_TABLE); visualNode.setAttribute(HtmlComponentUtil.HTML_STYLE_ATTR, GROUP_TABLE_STYLE); nsIDOMElement body = visualDocument.createElement(HtmlComponentUtil.HTML_TAG_TBODY); nsIDOMElement row = visualDocument.createElement(HtmlComponentUtil.HTML_TAG_TR); row.setAttribute(HtmlComponentUtil.HTML_ATTR_VALIGN, HtmlComponentUtil.HTML_ATTR_VALIGN_MIDDLE_VALUE); creationData = new VpeCreationData(visualNode); Iterator<SourceToolBarGroupItem> iterator = sourceToolBarGroupItems.iterator(); while(iterator.hasNext()) { SourceToolBarGroupItem toolBarGroupItem = iterator.next(); nsIDOMElement cell = visualDocument.createElement(HtmlComponentUtil.HTML_TAG_TD); if (toolBarGroupItem.isItem()) { String styleClass = sourceElement.hasAttribute(HtmlComponentUtil.HTML_STYLECLASS_ATTR) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_STYLECLASS_ATTR) : EMPTY; String style = sourceElement.hasAttribute(HtmlComponentUtil.HTML_STYLE_ATTR) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_STYLE_ATTR) : EMPTY; Node parentNode = sourceElement.getParentNode(); if ((null != parentNode) && (parentNode instanceof Element)) { Element parentElement = (Element)parentNode; if (parentElement.hasAttribute(RichFacesToolBarTemplate.CONTENTCLASS_ATTR_NAME)) { String contentClass = parentElement.getAttribute(RichFacesToolBarTemplate.CONTENTCLASS_ATTR_NAME); styleClass += SPACE + contentClass; } if (parentElement.hasAttribute(RichFacesToolBarTemplate.CONTENTSTYLE_ATTR_NAME)) { String contentStyle = parentElement.getAttribute(RichFacesToolBarTemplate.CONTENTSTYLE_ATTR_NAME); style += SPACE + contentStyle; } } styleClass += SPACE + CSS_DR_TOOLBAR_INT + SPACE + CSS_RICH_TOOLBAR_ITEM; cell.setAttribute(HtmlComponentUtil.HTML_CLASS_ATTR, styleClass); cell.setAttribute(HtmlComponentUtil.HTML_STYLE_ATTR, style); VpeChildrenInfo childrenInfo = new VpeChildrenInfo(cell); creationData.addChildrenInfo(childrenInfo); childrenInfo.addSourceChild(toolBarGroupItem.getToolBarGroupItem()); } else { cell.setAttribute(HtmlComponentUtil.HTML_ALIGN_ATTR, HtmlComponentUtil.HTML_ALIGN_CENTER_VALUE); ComponentUtil.correctAttribute(sourceElement, cell, RichFacesToolBarTemplate.SEPARATORCLASS_ATTR_NAME, HtmlComponentUtil.HTML_CLASS_ATTR, null, null); String separatorImageUrl = RichFacesToolBarTemplate .getSeparatorImageUrlString(toolBarGroupItem.getItemSeparator()); nsIDOMElement separatorImage = visualDocument.createElement(HtmlComponentUtil.HTML_TAG_IMG); ComponentUtil.setImg(separatorImage, separatorImageUrl); visualNode.appendChild(separatorImage); cell.appendChild(separatorImage); } row.appendChild(cell); } body.appendChild(row); visualNode.appendChild(body); } return creationData; } @Override public Node getNodeForUpdate(VpePageContext pageContext, Node sourceNode, nsIDOMNode visualNode, Object data) { String prefix = sourceNode.getPrefix(); if (prefix == null) { return null; } String parentNodeName = prefix + ":" + RichFacesToolBarTemplate.TAG_NAME; //$NON-NLS-1$ Node parent = sourceNode.getParentNode(); while (parent != null) { if (parentNodeName.equals(parent.getNodeName())) { break; } parent = parent.getParentNode(); } return parent; } }