/*******************************************************************************
* 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 static org.jboss.tools.vpe.xulrunner.util.XPCOM.queryInterface;
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.VpeCreationData;
import org.jboss.tools.vpe.editor.util.Constants;
import org.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMNode;
import org.mozilla.interfaces.nsIDOMNodeList;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* Template for Rich Faces separator
*/
public class RichFacesSeparatorTemplate extends VpeAbstractTemplate {
final static String STYLE_PATH = "separator/separator.css"; //$NON-NLS-1$
final static String LINE_SOLID = "solid"; //$NON-NLS-1$
final static String LINE_DOUBLE = "double"; //$NON-NLS-1$
final static String LINE_DOTTED = "dotted"; //$NON-NLS-1$
final static String LINE_DASHED = "dashed"; //$NON-NLS-1$
final static String LINE_BEVELED = "beveled"; //$NON-NLS-1$
final static String PIXEL_PREFIX = "px"; //$NON-NLS-1$
final static String PERCENT_PREFIX = "%"; //$NON-NLS-1$
final static String[] LINE_TYPES = { LINE_SOLID, LINE_DOUBLE, LINE_DOTTED,
LINE_DASHED, LINE_BEVELED };
final static String LINE_TYPE_ATTR = "lineType"; //$NON-NLS-1$
final static String DEFAULT_HEIGHT = "6px"; //$NON-NLS-1$
final static String DEFAULT_ALIGN = "left"; //$NON-NLS-1$
final static String DEFAULT_WIDTH = "100%"; //$NON-NLS-1$
/**
* Creates a node of the visual tree on the node of the source tree. This
* visual node should not have the parent node This visual node can have
* child nodes.
*
* @param pageContext
* Contains the information on edited page.
* @param sourceNode
* The current node of the source tree.
* @param visualDocument
* The document of the visual tree.
* @return The information on the created node of the visual tree.
*/
public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) {
ComponentUtil.setCSSLink(pageContext, STYLE_PATH, "richFacesSeparator"); //$NON-NLS-1$
Element sourceElement = (Element) sourceNode;
/* Create new html element table */
nsIDOMElement separator = visualDocument
.createElement(HtmlComponentUtil.HTML_TAG_DIV);
nsIDOMElement line = visualDocument
.createElement(HtmlComponentUtil.HTML_TAG_DIV);
VpeCreationData creationData = new VpeCreationData(separator);
String width = sourceElement.hasAttribute(HtmlComponentUtil.HTML_ATR_WIDTH) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_ATR_WIDTH) : null;
String height = sourceElement.hasAttribute(HtmlComponentUtil.HTML_ATR_HEIGHT) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_ATR_HEIGHT) : null;
/* Set align for separator */
separator.setAttribute(HtmlComponentUtil.HTML_ALIGN_ATTR,
sourceElement.hasAttribute(HtmlComponentUtil.HTML_ALIGN_ATTR) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_ALIGN_ATTR) : DEFAULT_ALIGN);
separator.setAttribute(HtmlComponentUtil.HTML_CLASS_ATTR, "td-parentdiv"); //$NON-NLS-1$
String styleClassAttrName = "styleClass"; //$NON-NLS-1$
String lineClass = sourceElement.getAttribute(styleClassAttrName);
/* Apply class for separator */
String styleAttrName = "style"; //$NON-NLS-1$
String style = sourceElement.hasAttribute(styleAttrName) ? sourceElement.getAttribute(styleAttrName) : null;
String lineType = sourceElement.hasAttribute(LINE_TYPE_ATTR) ? sourceElement.getAttribute(LINE_TYPE_ATTR) : null;
if (!sourceElement.hasAttribute(LINE_TYPE_ATTR) || lineType.equalsIgnoreCase(LINE_BEVELED)) {
String className = "dr-table-header rich-table-header-continue"; //$NON-NLS-1$
if (sourceElement.hasAttribute(styleClassAttrName)) {
className += Constants.WHITE_SPACE + lineClass;
}
line.setAttribute(HtmlComponentUtil.HTML_CLASS_ATTR, className);
style = setBeveledStyle(width, height, ComponentUtil
.getHeaderBackgoundImgStyle() + ";" + style); //$NON-NLS-1$
} else {
line.setAttribute(HtmlComponentUtil.HTML_CLASS_ATTR, lineClass);
style = setStyle(lineType, width, height, style);
line.setAttribute(HtmlComponentUtil.HTML_CLASS_ATTR,
"separator-color"); //$NON-NLS-1$
}
line.setAttribute(HtmlComponentUtil.HTML_STYLE_ATTR, style);
separator.appendChild(line);
return creationData;
}
/**
* Method for remove attributes in separator
*/
@Override
public void removeAttribute(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMNode visualNode, Object data, String name) {
super.removeAttribute(pageContext, sourceElement, visualDocument, visualNode, data, name);
nsIDOMElement element = queryInterface(visualNode, nsIDOMElement.class);
nsIDOMElement line = getLineElement(element);
String style = sourceElement.hasAttribute(HtmlComponentUtil.HTML_STYLE_ATTR) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_STYLE_ATTR) : null;
String width = sourceElement.hasAttribute(HtmlComponentUtil.HTML_ATR_WIDTH) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_ATR_WIDTH) : null;
String height = sourceElement.hasAttribute(HtmlComponentUtil.HTML_ATR_HEIGHT) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_ATR_HEIGHT) : null;
String newStyle;
String lineType = sourceElement.hasAttribute(LINE_TYPE_ATTR) ? sourceElement.getAttribute(LINE_TYPE_ATTR) : LINE_BEVELED;
if (name.equalsIgnoreCase(HtmlComponentUtil.HTML_ATR_HEIGHT)
|| name.equalsIgnoreCase(LINE_TYPE_ATTR)
|| name.equalsIgnoreCase(HtmlComponentUtil.HTML_ATR_WIDTH)) {
if (LINE_BEVELED.equalsIgnoreCase(lineType)) {
newStyle = setBeveledStyle(width, height, ComponentUtil
.getHeaderBackgoundImgStyle() + ";" + style); //$NON-NLS-1$
} else {
newStyle = setStyle(lineType, (width == null ? DEFAULT_WIDTH
: addPrefixSize(width)),
(height == null ? DEFAULT_HEIGHT
: addPrefixSize(height)), style);
}
line.setAttribute(HtmlComponentUtil.HTML_STYLE_ATTR, newStyle);
} else if (name.equalsIgnoreCase(HtmlComponentUtil.HTML_ALIGN_ATTR)) {
element.removeAttribute(name);
} else if (name.equalsIgnoreCase(HtmlComponentUtil.HTML_STYLE_ATTR)) {
if (LINE_BEVELED.equalsIgnoreCase(lineType)) {
newStyle = setBeveledStyle(width, height, ComponentUtil
.getHeaderBackgoundImgStyle());
} else {
newStyle = setStyle(lineType, (width == null ? DEFAULT_WIDTH
: addPrefixSize(width)),
(height == null ? DEFAULT_HEIGHT : height), ""); //$NON-NLS-1$
}
line.setAttribute(name, newStyle);
} else {
line.removeAttribute(name);
}
}
/*
* @see com.exadel.vpe.editor.template.VpeAbstractTemplate#setAttribute(com.exadel.vpe.editor.context.VpePageContext,
* org.w3c.dom.Element, org.w3c.dom.Document, org.w3c.dom.Node,
* java.lang.Object, java.lang.String, java.lang.String)
*/
@Override
public void setAttribute(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMNode visualNode, Object data, String name, String value) {
String newStyle;
super.setAttribute(pageContext, sourceElement, visualDocument,
visualNode, data, name, value);
nsIDOMElement element = queryInterface(visualNode, nsIDOMElement.class);
nsIDOMElement line = getLineElement(element);
String style = sourceElement.hasAttribute(HtmlComponentUtil.HTML_STYLE_ATTR) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_STYLE_ATTR) : null;
String width = sourceElement.hasAttribute(HtmlComponentUtil.HTML_ATR_WIDTH) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_ATR_WIDTH) : null;
String height = sourceElement.hasAttribute(HtmlComponentUtil.HTML_ATR_HEIGHT) ? sourceElement.getAttribute(HtmlComponentUtil.HTML_ATR_HEIGHT) : null;
String lineType = sourceElement.hasAttribute(LINE_TYPE_ATTR) ? sourceElement.getAttribute(LINE_TYPE_ATTR) : LINE_BEVELED;
if (name.equalsIgnoreCase(HtmlComponentUtil.HTML_ATR_HEIGHT)) {
if (!isNumber(value) && (value.indexOf(PIXEL_PREFIX)) == -1) {
return;
}
if (LINE_BEVELED.equalsIgnoreCase(lineType)) {
newStyle = setBeveledStyle(width, value, ComponentUtil
.getHeaderBackgoundImgStyle() + ";" + style); //$NON-NLS-1$
} else {
newStyle = setStyle(
lineType,
(width == null ? DEFAULT_WIDTH : addPrefixSize(width)),
(value == null ? DEFAULT_HEIGHT : addPrefixSize(value)),
style);
}
line.setAttribute(HtmlComponentUtil.HTML_STYLE_ATTR, newStyle);
} else if (name.equalsIgnoreCase(HtmlComponentUtil.HTML_ATR_WIDTH)) {
if (!isNumber(value) && !isHasPrefix(value)) {
return;
}
if (lineType.equalsIgnoreCase(LINE_BEVELED)) {
newStyle = setBeveledStyle(value, height, ComponentUtil
.getHeaderBackgoundImgStyle() + ";" + style); //$NON-NLS-1$
} else {
newStyle = setStyle(lineType, (value == null ? DEFAULT_WIDTH
: addPrefixSize(value)),
(height == null ? DEFAULT_HEIGHT
: addPrefixSize(height)), style);
}
line.setAttribute(HtmlComponentUtil.HTML_STYLE_ATTR, newStyle);
} else if (name.equalsIgnoreCase(LINE_TYPE_ATTR)) {
if (!isLineType(value)) {
return;
}
if (value.equalsIgnoreCase(LINE_BEVELED)) {
newStyle = setBeveledStyle(width, height, ComponentUtil
.getHeaderBackgoundImgStyle() + ";" + style); //$NON-NLS-1$
} else {
newStyle = setStyle(value, (width == null ? DEFAULT_WIDTH
: addPrefixSize(width)),
(height == null ? DEFAULT_HEIGHT
: addPrefixSize(height)), style);
}
line.setAttribute(HtmlComponentUtil.HTML_STYLE_ATTR, newStyle);
} else if (name.equalsIgnoreCase(HtmlComponentUtil.HTML_ALIGN_ATTR)) {
element.setAttribute(name, value);
} else if (name.equalsIgnoreCase(HtmlComponentUtil.HTML_STYLE_ATTR)) {
if (lineType.equalsIgnoreCase(LINE_BEVELED)) {
newStyle = setBeveledStyle(width, value, ComponentUtil
.getHeaderBackgoundImgStyle()
+ ";" + (value == null ? "" : value)); //$NON-NLS-1$ //$NON-NLS-2$
} else {
newStyle = setStyle(lineType, (width == null ? DEFAULT_WIDTH
: addPrefixSize(width)),
(height == null ? DEFAULT_HEIGHT
: addPrefixSize(height)), value);
}
line.setAttribute(name, newStyle);
} else {
line.setAttribute(name, value);
}
}
/**
* Method add in size extention prefix(default 'px').
*
* @param size
* @return size;
*/
private String addPrefixSize(String size) {
if (size != null) {
if (isHasPrefix(size) == false) {
size = size + PIXEL_PREFIX;
}
}
return size;
}
/**
* Method for checking String by number
*
* @param num
* @return true - if String is number, false is not number
*/
private boolean isNumber(String num) {
try {
Integer.valueOf(num);
return true;
} catch (NumberFormatException e) {
return false;
}
}
/**
* Method for checking String by consist prefix "px" or "%"
*
* @param size
* @return true - if string consist prefix "px" or "%"
*/
private boolean isHasPrefix(String size) {
int pos1 = size.indexOf(PIXEL_PREFIX);
int pos2 = size.indexOf(PERCENT_PREFIX);
if (pos1 == -1 && pos2 == -1) {
return false;
}
return true;
}
/**
* Validate lineType .
*
* @param lineType
* @return boolean
*/
private boolean isLineType(String lineType) {
for (int i = 0; i < LINE_TYPES.length; i++) {
if (lineType.equalsIgnoreCase(LINE_TYPES[i])) {
return true;
}
}
return false;
}
private nsIDOMElement getLineElement(nsIDOMElement parent) {
nsIDOMNodeList list = parent.getChildNodes();
nsIDOMNode node = list.item(0);
nsIDOMElement element = queryInterface(node, nsIDOMElement.class);
return element;
}
/**
* Create new CSS style for separator .
*
* @param lineType
* @param width
* @param height
* @param style
* @return new style
*/
private String setStyle(String lineType, String width, String height,
String style) {
StringBuffer newStyle = new StringBuffer();
newStyle.append(HtmlComponentUtil.CSS_BORDER_STYLE + ":" + (lineType == null ? LINE_SOLID : lineType) + ";"); //$NON-NLS-1$ //$NON-NLS-2$
newStyle.append(HtmlComponentUtil.CSS_BORDER_WIDTH + ":" + (height == null ? DEFAULT_HEIGHT : height) + " 0px 0px;"); //$NON-NLS-1$ //$NON-NLS-2$
newStyle.append(HtmlComponentUtil.HTML_ATR_WIDTH + ":" + (width == null ? DEFAULT_WIDTH : width) + ";"); //$NON-NLS-1$ //$NON-NLS-2$
newStyle.append((style == null ? "" : style)); //$NON-NLS-1$
return newStyle.toString();
}
/**
* Create new CSS style for beveled separator.
*
* @param width
* @param height
* @param style
* @return new style
*/
private String setBeveledStyle(String width, String height, String style) {
StringBuffer newStyle = new StringBuffer();
newStyle.append(HtmlComponentUtil.HTML_ATR_HEIGHT + ":" + (height == null ? DEFAULT_HEIGHT : height) + ";"); //$NON-NLS-1$ //$NON-NLS-2$
newStyle.append(HtmlComponentUtil.HTML_ATR_WIDTH + ":" + (width == null ? DEFAULT_WIDTH : width) + ";"); //$NON-NLS-1$ //$NON-NLS-2$
newStyle.append((style == null ? "" : style)); //$NON-NLS-1$
return newStyle.toString();
}
}