/*******************************************************************************
* 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.HashMap;
import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil;
import org.jboss.tools.vpe.editor.VpeVisualDomBuilder;
import org.jboss.tools.vpe.editor.context.VpePageContext;
import org.jboss.tools.vpe.editor.template.VpeChildrenInfo;
import org.jboss.tools.vpe.editor.template.VpeCreationData;
import org.jboss.tools.vpe.editor.util.Constants;
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;
public class RichFacesMessagesTemplate extends RichFacesMessageTemplate {
private static final String LAYOUT = "layout"; //$NON-NLS-1$
private static final String TABLE = "table"; //$NON-NLS-1$
private static final String CSS_RICH_MESSAGES = "rich-messages"; //$NON-NLS-1$
private static final String CSS_RICH_MESSAGES_MARKER = "rich-messages-marker"; //$NON-NLS-1$
private static final String CSS_RICH_MESSAGES_LABEL = "rich-messages-label"; //$NON-NLS-1$
@Override
public VpeCreationData create(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument) {
VpeCreationData creationData = null;
final Element sourceElement = (Element) sourceNode;
final Attributes attrs = new Attributes(sourceElement);
String styleClass = CSS_RICH_MESSAGES;
final String layout = ((Element) sourceNode).getAttribute(LAYOUT);
final nsIDOMElement container;
if (TABLE.equalsIgnoreCase(layout)) {
container = visualDocument.createElement(HTML.TAG_TABLE);
container.setAttribute(HTML.ATTR_CELLPADDING, "0"); //$NON-NLS-1$
container.setAttribute(HTML.ATTR_CELLSPACING, "0"); //$NON-NLS-1$
} else {
/*
* If layout is either list or iterator or not specified
* use list layout by default.
*/
container = visualDocument.createElement(HTML.TAG_DL);
}
if (ComponentUtil.isNotBlank(attrs.getStyleValue())) {
container.setAttribute(HTML.ATTR_STYLE, attrs.getStyleValue());
}
if (ComponentUtil.isNotBlank(attrs.getStyleClassValue())) {
styleClass += Constants.WHITE_SPACE + attrs.getStyleClassValue();
}
container.setAttribute(HTML.ATTR_CLASS, styleClass);
creationData = new VpeCreationData(container);
final HashMap<String, Node> facets = getFacelets((Element) sourceNode);
for (int i = 0; i < markers.length; i++) {
if (facets.containsKey(markers[i])) {
container.appendChild(createVisualMessage(creationData,
visualDocument, layout, i,
(Element) facets.get(markers[i]), attrs));
} else {
container.appendChild(createVisualMessage(creationData,
visualDocument, layout, i, null, attrs));
}
}
return creationData;
}
/**
* Method for creating rich:message template if rich:message has facets
*
* @param visualDocument
* @param sourceElement
* @param facets
* @return
*/
private nsIDOMElement createVisualMessage(VpeCreationData creationData,
nsIDOMDocument visualDocument, String layout, int markerNum,
Element facet, Attributes attrs) {
String containerClass = Constants.EMPTY;
String markerClass = CSS_RICH_MESSAGES_MARKER;
String labelClass = CSS_RICH_MESSAGES_LABEL;
final String labelMessage;
final nsIDOMElement topContainer;
final nsIDOMElement container;
final nsIDOMElement marker = visualDocument
.createElement(HTML.TAG_SPAN);
final nsIDOMElement label = visualDocument
.createElement(HTML.TAG_SPAN);
if (TABLE.equalsIgnoreCase(layout)) {
final nsIDOMElement tr = visualDocument.createElement(HTML.TAG_TR);
container = visualDocument.createElement(HTML.TAG_TD);
tr.appendChild(container);
container.appendChild(marker);
container.appendChild(label);
topContainer = tr;
} else {
/*
* If layout is either list or iterator or not specified use list
* layout by default.
*/
container = visualDocument.createElement(HTML.TAG_DT);
container.appendChild(marker);
container.appendChild(label);
topContainer = container;
}
if (facet != null) {
final VpeChildrenInfo childrenInfo = new VpeChildrenInfo(marker);
marker.setAttribute(VpeVisualDomBuilder.VPE_FACET, facet
.getAttribute(RichFaces.ATTR_NAME));
creationData.addChildrenInfo(childrenInfo);
childrenInfo.addSourceChild(facet);
}
/*
* apply styles and classes
*/
switch (markerNum) {
case 0: // passed
labelMessage = (attrs.getPassedLabelValue() == null)
? Constants.EMPTY
: attrs.getPassedLabelValue();
if (ComponentUtil.isNotBlank(attrs.getMarkerClassValue())) {
markerClass += Constants.WHITE_SPACE
+ attrs.getMarkerClassValue();
}
if (ComponentUtil.isNotBlank(attrs.getLabelClassValue())) {
labelClass += Constants.WHITE_SPACE
+ attrs.getLabelClassValue();
}
break;
case 1: // error
labelMessage = ERROR_MESSAGE;
if (ComponentUtil.isNotBlank(attrs.getErrorClassValue())) {
containerClass += Constants.WHITE_SPACE
+ attrs.getErrorClassValue();
}
if (ComponentUtil.isNotBlank(attrs.getErrorMarkerClassValue())) {
markerClass += Constants.WHITE_SPACE
+ attrs.getErrorMarkerClassValue();
}
if (ComponentUtil.isNotBlank(attrs.getErrorLabelClassValue())) {
labelClass += Constants.WHITE_SPACE
+ attrs.getErrorLabelClassValue();
}
break;
case 2: // fatal
labelMessage = FATAL_MESSAGE;
if (ComponentUtil.isNotBlank(attrs.getFatalClassValue())) {
containerClass += Constants.WHITE_SPACE
+ attrs.getFatalClassValue();
}
if (ComponentUtil.isNotBlank(attrs.getFatalMarkerClassValue())) {
markerClass += Constants.WHITE_SPACE
+ attrs.getFatalMarkerClassValue();
}
if (ComponentUtil.isNotBlank(attrs.getFatalLabelClassValue())) {
labelClass += Constants.WHITE_SPACE
+ attrs.getFatalLabelClassValue();
}
break;
case 3: // info
labelMessage = INFO_MESSAGE;
if (ComponentUtil.isNotBlank(attrs.getInfoClassValue())) {
containerClass += Constants.WHITE_SPACE
+ attrs.getInfoClassValue();
}
if (ComponentUtil.isNotBlank(attrs.getInfoMarkerClassValue())) {
markerClass += Constants.WHITE_SPACE
+ attrs.getInfoMarkerClassValue();
}
if (ComponentUtil.isNotBlank(attrs.getInfoLabelClassValue())) {
labelClass += Constants.WHITE_SPACE
+ attrs.getInfoLabelClassValue();
}
break;
case 4: // warn
labelMessage = WARNING_MESSAGE;
if (ComponentUtil.isNotBlank(attrs.getWarnClassValue())) {
containerClass += Constants.WHITE_SPACE
+ attrs.getWarnClassValue();
}
if (ComponentUtil.isNotBlank(attrs.getWarnMarkerClassValue())) {
markerClass += Constants.WHITE_SPACE
+ attrs.getWarnMarkerClassValue();
}
if (ComponentUtil.isNotBlank(attrs.getWarnLabelClassValue())) {
labelClass += Constants.WHITE_SPACE
+ attrs.getWarnLabelClassValue();
}
break;
default:
labelMessage = Constants.EMPTY;
break;
}
if (ComponentUtil.isNotBlank(containerClass)) {
container.setAttribute(HTML.ATTR_CLASS, containerClass);
}
marker.setAttribute(HTML.ATTR_CLASS, markerClass);
label.setAttribute(HTML.ATTR_CLASS, labelClass);
final nsIDOMText text = visualDocument.createTextNode(labelMessage);
label.appendChild(text);
return topContainer;
}
}