/*******************************************************************************
* 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.Iterator;
import java.util.LinkedList;
import java.util.List;
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.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;
public class RichFacesToolBarTemplate extends VpeAbstractTemplate {
public static final String TAG_NAME = "toolBar"; //$NON-NLS-1$
public static final String ITEM_SEPARATOR_NONE = "none"; //$NON-NLS-1$
public static final String ITEM_SEPARATOR_LINE = "line"; //$NON-NLS-1$
public static final String ITEM_SEPARATOR_GRID = "grid"; //$NON-NLS-1$
public static final String ITEM_SEPARATOR_DISC = "disc"; //$NON-NLS-1$
public static final String ITEM_SEPARATOR_SQUARE = "square"; //$NON-NLS-1$
public static final String ITEM_SEPARATOR_LINE_URL = "toolBar/separatorLine.gif"; //$NON-NLS-1$
public static final String ITEM_SEPARATOR_GRID_URL = "toolBar/separatorGrid.gif"; //$NON-NLS-1$
public static final String ITEM_SEPARATOR_DISC_URL = "toolBar/separatorDisc.gif"; //$NON-NLS-1$
public static final String ITEM_SEPARATOR_SQUARE_URL = "toolBar/separatorSquare.gif"; //$NON-NLS-1$
public static final String EXCEPTION_ATTR_STYLE_VALUE = "color: red; font-weight:bold;"; //$NON-NLS-1$
static final String CONTENTCLASS_ATTR_NAME = "contentClass"; //$NON-NLS-1$
static final String CONTENTSTYLE_ATTR_NAME = "contentStyle"; //$NON-NLS-1$
static final String STYLEATTR_CLASS_NAME = "styleClass"; //$NON-NLS-1$
static final String ATTR_STYLE_NAME = "style"; //$NON-NLS-1$
static final String ITEMSEPARATOR_ATTR_NAME = "itemSeparator"; //$NON-NLS-1$
static final String SEPARATORCLASS_ATTR_NAME = "separatorClass"; //$NON-NLS-1$
static final String WIDTH_ATTR_NAME = "width"; //$NON-NLS-1$
static final String HEIGHT_ATTR_NAME = "height"; //$NON-NLS-1$
private static final String CSS_DR_TOOLBAR_INT = "dr-toolbar-int"; //$NON-NLS-1$
private static final String CSS_DR_TOOLBAR_EXT = "dr-toolbar-ext"; //$NON-NLS-1$
private static final String CSS_RICH_TOOLBAR = "rich-toolbar"; //$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$
public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) {
nsIDOMElement visualNode = visualDocument.createElement(HTML.TAG_TABLE);
VpeCreationData creationData = new VpeCreationData(visualNode);
Element sourceElement = (Element) sourceNode;
String itemSeparator = sourceElement.getAttribute(ITEMSEPARATOR_ATTR_NAME);
itemSeparator = checkAndUpdateItemSeparatorName(itemSeparator);
SourceToolBarItems sourceToolBarItems = new SourceToolBarItems(sourceNode, itemSeparator);
String itemSeparatorImageUrl = getSeparatorImageUrlString(sourceToolBarItems.getItemSeparator());
ComponentUtil.setCSSLink(pageContext, "toolBar/toolBar.css", "richFacesToolBar"); //$NON-NLS-1$ //$NON-NLS-2$
ComponentUtil.correctAttribute(sourceElement, visualNode,
WIDTH_ATTR_NAME,
HTML.ATTR_WIDTH, null, "100%"); //$NON-NLS-1$
ComponentUtil.correctAttribute(sourceElement, visualNode,
HEIGHT_ATTR_NAME,
HTML.ATTR_HEIGHT, null, null);
ComponentUtil.correctAttribute(sourceElement, visualNode,
STYLEATTR_CLASS_NAME, HTML.ATTR_CLASS,
CSS_DR_TOOLBAR_EXT + SPACE + CSS_RICH_TOOLBAR,
CSS_DR_TOOLBAR_EXT + SPACE + CSS_RICH_TOOLBAR);
String style = ComponentUtil.getHeaderBackgoundImgStyle() + ";"; //$NON-NLS-1$
ComponentUtil.correctAttribute(sourceElement, visualNode,
ATTR_STYLE_NAME,
HTML.ATTR_STYLE, style, style);
nsIDOMElement body = null;
nsIDOMElement row = null;
nsIDOMElement cell = null;
body = visualDocument.createElement(HTML.TAG_TBODY);
row = visualDocument.createElement(HTML.TAG_TR);
row.setAttribute(HTML.ATTR_VALIGN, HTML.VALUE_ALIGN_MIDDLE);
SourceToolBarItem toolBarItem;
Iterator<SourceToolBarItem> iterator = sourceToolBarItems.getLeftItemsIterator();
while (iterator.hasNext()) {
toolBarItem = iterator.next();
cell = visualDocument.createElement(HTML.TAG_TD);
if (toolBarItem.isItem()) {
ComponentUtil.correctAttribute(sourceElement, cell,
CONTENTCLASS_ATTR_NAME,
HTML.ATTR_CLASS,
CSS_DR_TOOLBAR_INT + SPACE + CSS_RICH_TOOLBAR_ITEM,
CSS_DR_TOOLBAR_INT + SPACE + CSS_RICH_TOOLBAR_ITEM);
ComponentUtil.correctAttribute(sourceElement, cell,
CONTENTSTYLE_ATTR_NAME,
HTML.ATTR_STYLE,
toolBarItem.isToolBarGroupItem() ? "padding: 0px 0px 0px 0px;" : null, //$NON-NLS-1$
toolBarItem.isToolBarGroupItem() ? "padding: 0px 0px 0px 0px;" : null); //$NON-NLS-1$
VpeChildrenInfo childrenInfo = new VpeChildrenInfo(cell);
creationData.addChildrenInfo(childrenInfo);
childrenInfo.addSourceChild(toolBarItem.getToolBarItem());
} else {
if (itemSeparatorImageUrl != null) {
cell = visualDocument.createElement(HTML.TAG_TD);
cell.setAttribute(HTML.ATTR_ALIGN,
HTML.VALUE_ALIGN_CENTER);
ComponentUtil.correctAttribute(sourceElement, cell,
SEPARATORCLASS_ATTR_NAME,
HTML.ATTR_CLASS, null, null);
nsIDOMElement separatorImage = visualDocument
.createElement(HTML.TAG_IMG);
ComponentUtil.setImg(separatorImage, itemSeparatorImageUrl);
cell.appendChild(separatorImage);
}
}
row.appendChild(cell);
}
// Empty column
cell = visualDocument.createElement(HTML.TAG_TD);
cell.setAttribute(HTML.ATTR_WIDTH, "100%"); //$NON-NLS-1$
row.appendChild(cell);
iterator = sourceToolBarItems.getRightItemsIterator();
while (iterator.hasNext()) {
toolBarItem = iterator.next();
cell = visualDocument.createElement(HTML.TAG_TD);
if (toolBarItem.isItem()) {
ComponentUtil.correctAttribute(sourceElement, cell,
CONTENTCLASS_ATTR_NAME,
HTML.ATTR_CLASS, CSS_DR_TOOLBAR_INT + SPACE + CSS_RICH_TOOLBAR_ITEM, CSS_DR_TOOLBAR_INT + SPACE + CSS_RICH_TOOLBAR_ITEM);
ComponentUtil.correctAttribute(sourceElement, cell,
CONTENTSTYLE_ATTR_NAME,
HTML.ATTR_STYLE,
toolBarItem.isToolBarGroupItem() ? "padding: 0px;" : null, //$NON-NLS-1$
toolBarItem.isToolBarGroupItem() ? "padding: 0px;" : null); //$NON-NLS-1$
VpeChildrenInfo childrenInfo = new VpeChildrenInfo(cell);
creationData.addChildrenInfo(childrenInfo);
childrenInfo.addSourceChild(toolBarItem.getToolBarItem());
} else {
if (itemSeparatorImageUrl != null) {
cell = visualDocument.createElement(HTML.TAG_TD);
cell.setAttribute(HTML.ATTR_ALIGN, HTML.VALUE_ALIGN_CENTER);
ComponentUtil.correctAttribute(sourceElement, cell,
SEPARATORCLASS_ATTR_NAME,
HTML.ATTR_CLASS, null, null);
nsIDOMElement separatorImage = visualDocument.createElement(HTML.TAG_IMG);
ComponentUtil.setImg(separatorImage, itemSeparatorImageUrl);
cell.appendChild(separatorImage);
}
}
row.appendChild(cell);
}
body.appendChild(row);
visualNode.appendChild(body);
return creationData;
}
/**
*
* @param visualDocument
* @param message
* @return
*/
static nsIDOMElement createExceptionNode(nsIDOMDocument visualDocument, String message) {
nsIDOMElement visualNode;
visualNode = visualDocument.createElement(HTML.TAG_SPAN);
visualNode.setAttribute(HTML.ATTR_STYLE, EXCEPTION_ATTR_STYLE_VALUE);
nsIDOMText text = visualDocument.createTextNode(message);
visualNode.appendChild(text);
return visualNode;
}
// public VpeCreationData create(VpePageContext pageContext, Node sourceNode, Document visualDocument) {
// SourceToolBarElements sourceElements = new SourceToolBarElements(sourceNode);
// VisualToolBarElements visualElements = new VisualToolBarElements();
//
// Element sourceElement = (Element)sourceNode;
//
// ComponentUtil.setCSSLink(pageContext, "toolBar/toolBar.css", "richFacesToolBar");
//
// Element visualTable = visualDocument.createElement("table");
//
// ComponentUtil.correctAttribute(sourceElement, visualTable,
// ATTR_WIDTH_NAME,
// HTML.ATTR_WIDTH, null, "100%");
// ComponentUtil.correctAttribute(sourceElement, visualTable,
// ATTR_HEIGHT_NAME,
// HTML.ATTR_HEIGHT, null, null);
// ComponentUtil.correctAttribute(sourceElement, visualTable,
// STYLEATTR_CLASS_NAME,
// HTML.ATTR_CLASS, "dr-toolbar-ext rich-toolbar", "dr-toolbar-ext rich-toolbar");
//
// String style = ComponentUtil.getHeaderBackgoundImgStyle() + ";";
// ComponentUtil.correctAttribute(sourceElement, visualTable,
// ATTR_STYLE_NAME,
// HTML.ATTR_STYLE, style, style);
//
//
// VpeCreationData creatorInfo = new VpeCreationData(visualTable);
//
// String separatorClass = sourceElement.getAttribute("separatorClass");
//
// Element section = null, row = null, cell = null;
//
// if (true || sourceElements.hasBodySection()) {
// section = visualDocument.createElement("tbody");
// row = visualDocument.createElement("tr");
// row.setAttribute("valign", "middle");
//
// // Columns at left
// for (int i = 0; i < sourceElements.getColumnAtLeftCount(); i++) {
// SourceToolBarColumnElements column = sourceElements.getColumnAtLeft(i);
//
// if (column.hasBody()) {
// Node columnBody = column.getColumn();
// cell = visualDocument.createElement("td");
// ComponentUtil.correctAttribute(sourceElement, cell,
// CONTENTATTR_CLASS_NAME,
// HTML.ATTR_CLASS, "dr-toolbar-int rich-toolbar-item", "dr-toolbar-int rich-toolbar-item");
// ComponentUtil.correctAttribute(sourceElement, cell,
// CONTENTATTR_STYLE_NAME,
// HTML.ATTR_STYLE, null, null);
//
// row.appendChild(cell);
//
// VpeChildrenInfo info = new VpeChildrenInfo(cell);
// creatorInfo.addChildrenInfo(info);
//
// info.addSourceChild(column.getColumn());
// MozillaSupports.release(cell);
// } else if (column.isSeparator()){
// String itemSeparator = column.getSeparatorType();
// String separatorImageUrl = getSeparatorImageUrlString (itemSeparator);
//
// if (separatorImageUrl != null) {
// // Insert separator here
// cell = visualDocument.createElement("td");
// cell.setAttribute("align", "center");
// ComponentUtil.correctAttribute(sourceElement, cell,
// SEPARATORATTR_CLASS_NAME,
// HTML.ATTR_CLASS, null, null);
// Element separatorImage = visualDocument.createElement("img");
// ComponentUtil.setImg(separatorImage, separatorImageUrl);
// cell.appendChild(separatorImage);
// row.appendChild(cell);
// MozillaSupports.release(separatorImage);
// MozillaSupports.release(cell);
// }
// }
// }
//
// // Empty column
// cell = visualDocument.createElement("td");
// cell.setAttribute("width", "100%");
// row.appendChild(cell);
// MozillaSupports.release(cell);
//
// // Columns at right
// for (int i = 0; i < sourceElements.getColumnAtRightCount(); i++) {
// SourceToolBarColumnElements column = sourceElements.getColumnAtRight(i);
// if (column.hasBody()) {
// Node columnBody = column.getColumn();
// cell = visualDocument.createElement("td");
// ComponentUtil.correctAttribute(sourceElement, cell,
// CONTENTATTR_CLASS_NAME,
// HTML.ATTR_CLASS, "dr-toolbar-int rich-toolbar-item", "dr-toolbar-int rich-toolbar-item");
// ComponentUtil.correctAttribute(sourceElement, cell,
// CONTENTATTR_STYLE_NAME,
// HTML.ATTR_STYLE, null, null);
// row.appendChild(cell);
//
// VpeChildrenInfo info = new VpeChildrenInfo(cell);
// creatorInfo.addChildrenInfo(info);
//
// info.addSourceChild(column.getColumn());
// MozillaSupports.release(cell);
// } else if (column.isSeparator()){
// String itemSeparator = column.getSeparatorType();
// String separatorImageUrl = getSeparatorImageUrlString (itemSeparator);
//
// if (separatorImageUrl != null) {
// // Insert separator here
// cell = visualDocument.createElement("td");
// cell.setAttribute("align", "center");
// ComponentUtil.correctAttribute(sourceElement, cell,
// SEPARATORATTR_CLASS_NAME,
// HTML.ATTR_CLASS, null, null);
// Element separatorImage = visualDocument.createElement("img");
// ComponentUtil.setImg(separatorImage, separatorImageUrl);
// cell.appendChild(separatorImage);
// row.appendChild(cell);
// MozillaSupports.release(separatorImage);
// MozillaSupports.release(cell);
// }
// }
// }
//
//
// section.appendChild(row);
// MozillaSupports.release(row);
// visualTable.appendChild(section);
// MozillaSupports.release(section);
// visualElements.setBodyRow(row);
// visualElements.setBody(section);
// }
//
// Map visualNodeMap = pageContext.getDomMapping().getVisualMap();
//
// Object[] elements = new Object[2];
// elements[0] = visualElements;
// elements[1] = sourceElements;
// visualNodeMap.put(this, elements);
//
// return creatorInfo;
// }
public static String getSeparatorImageUrlString (String itemSeparator) {
String separatorImageUrl = null;
if (ITEM_SEPARATOR_DISC.equals(itemSeparator)) {
separatorImageUrl = ITEM_SEPARATOR_DISC_URL;
} else if (ITEM_SEPARATOR_GRID.equals(itemSeparator)) {
separatorImageUrl = ITEM_SEPARATOR_GRID_URL;
} else if (ITEM_SEPARATOR_LINE.equals(itemSeparator)) {
separatorImageUrl = ITEM_SEPARATOR_LINE_URL;
} else if (ITEM_SEPARATOR_SQUARE.equals(itemSeparator)) {
separatorImageUrl = ITEM_SEPARATOR_SQUARE_URL;
}
return separatorImageUrl;
}
static String checkAndUpdateItemSeparatorName(String itemSeparator) {
if (itemSeparator == null
|| (itemSeparator != null && itemSeparator.length() == 0)) {
return ITEM_SEPARATOR_NONE;
} else if (ITEM_SEPARATOR_DISC.equals(itemSeparator)
|| ITEM_SEPARATOR_LINE.equals(itemSeparator)
|| ITEM_SEPARATOR_GRID.equals(itemSeparator)
|| ITEM_SEPARATOR_SQUARE.equals(itemSeparator)
|| ITEM_SEPARATOR_NONE.equals(itemSeparator)) {
return itemSeparator;
}
return ITEM_SEPARATOR_NONE;
}
private class SourceToolBarItem {
private Node toolBarItem;
private String itemSeparator;
private boolean isToolBarItemLocationRight;
private boolean isToolBarGroupItem;
public SourceToolBarItem(Node toolBarItem) {
this.toolBarItem = toolBarItem;
this.itemSeparator = null;
this.isToolBarItemLocationRight = false;
if (toolBarItem.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) toolBarItem;
this.isToolBarGroupItem = element.getNodeName().endsWith(":" + RichFacesToolBarGroupTemplate.TAG_NAME); //$NON-NLS-1$
if (isToolBarGroupItem()) {
isToolBarItemLocationRight = RichFacesToolBarGroupTemplate
.ATTR_LOCATION_RIGHT_VALUE
.equals(element.getAttribute(RichFacesToolBarGroupTemplate.ATTR_LOCATION_NAME));
}
}
}
public SourceToolBarItem(String itemSeparator) {
this.toolBarItem = null;
this.itemSeparator = itemSeparator;
}
public Node getToolBarItem() {
return toolBarItem;
}
public String getItemSeparator() {
return itemSeparator;
}
public boolean isItem() {
return toolBarItem != null;
}
public boolean isToolBarItemLocationRight() {
return isToolBarItemLocationRight;
}
public boolean isToolBarGroupItem() {
return isToolBarGroupItem;
}
}
private class SourceToolBarItems {
private List<SourceToolBarItem> leftToolBarItems;
private List<SourceToolBarItem> rightToolBarItems;
private String itemSeparator;
private boolean itemSeparatorExists;
public SourceToolBarItems(Node sourceNode, String itemSeparator) {
this.leftToolBarItems = new LinkedList<SourceToolBarItem>();
this.rightToolBarItems = new LinkedList<SourceToolBarItem>();
this.itemSeparator = itemSeparator;
this.itemSeparatorExists = !(itemSeparator == null
|| itemSeparator.length() == 0
|| ITEMSEPARATOR_ATTR_NAME.equals(itemSeparator));
init(sourceNode);
}
private void init(Node sourceNode) {
NodeList childrenList = sourceNode.getChildNodes();
int childrenCount = childrenList.getLength();
for (int i=0; i < childrenCount; i++) {
Node child = childrenList.item(i);
if (isVisibleNode(child)) {
SourceToolBarItem toolBarItem = new SourceToolBarItem(child);
if (toolBarItem.isToolBarItemLocationRight()) {
if (isItemSeparatorExists()) {
rightToolBarItems.add(new SourceToolBarItem(itemSeparator));
}
rightToolBarItems.add(toolBarItem);
} else {
leftToolBarItems.add(toolBarItem);
if (isItemSeparatorExists()) {
leftToolBarItems.add(new SourceToolBarItem(itemSeparator));
}
}
}
}
// yradtsevich: JBIDE-4058:
// There should be no trailing separator after the left toolbar group
// and no leading separator at the beginning of the right toolbar group
if (isItemSeparatorExists() && !leftToolBarItems.isEmpty()) {
leftToolBarItems.remove(leftToolBarItems.size()-1);
}
if (isItemSeparatorExists() && !rightToolBarItems.isEmpty()) {
rightToolBarItems.remove(0);
}
}
public Iterator<SourceToolBarItem> getLeftItemsIterator() {
return leftToolBarItems.iterator();
}
public Iterator<SourceToolBarItem> getRightItemsIterator() {
return rightToolBarItems.iterator();
}
private boolean isVisibleNode(Node node) {
return node.getNodeType() == Node.ELEMENT_NODE
|| (node.getNodeType() == Node.TEXT_NODE
&& node.getNodeValue() != null
&& node.getNodeValue().trim().length() > 0);
}
public boolean isItemSeparatorExists() {
return itemSeparatorExists;
}
public String getItemSeparator() {
return itemSeparator;
}
}
}