/*******************************************************************************
* Copyright (c) 2007-2008 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.vpe.richfaces.template;
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.Constants;
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;
public class RichFacesMenuItemTemplate extends VpeAbstractTemplate {
/*
* rich:menuItem constants
*/
private static final String COMPONENT_NAME = "menuItem"; //$NON-NLS-1$
private static final String STYLE_PATH = "menuItem/menuItem.css"; //$NON-NLS-1$
private static final String SPACER_IMG_PATH = "menuItem/spacer.gif"; //$NON-NLS-1$
private static final String ICON_FACET_NAME = "icon"; //$NON-NLS-1$
private static final String ICON_DISABLED_FACET_NAME = "iconDisabled"; //$NON-NLS-1$
/*
* Constants for drop down mechanism.
*/
private static final String MENU_CHILD_ID = "vpe-ddm-menu-li"; //$NON-NLS-1$
/*
* rich:menuItem css styles names
*/
private static final String CSS_RICH_MENU_ITEM = "rich-menu-item"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_LABEL = "rich-menu-item-label"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_ICON = "rich-menu-item-icon"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_DISABLED = "rich-menu-item-disabled"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_ENABLED = "rich-menu-item-enabled"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_HOVER = "rich-menu-item-hover"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_LABEL_DISBLED = "rich-menu-item-label-disabled"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_ICON_DISABLED = "rich-menu-item-icon-disabled"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_LABEL_ENABLED = "rich-menu-item-label-enabled"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_ICON_ENABLED = "rich-menu-item-icon-enabled"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_LABEL_SELECTED = "rich-menu-item-label-selected"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_ICON_SELECTED = "rich-menu-item-icon-selected"; //$NON-NLS-1$
private static final String CSS_MENU_ITEM_TOP_DIV = "dr-menu-item-top-div"; //$NON-NLS-1$
public VpeCreationData create(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument) {
VpeCreationData creationData = null;
Element sourceElement = (Element)sourceNode;
ComponentUtil.setCSSLink(pageContext, STYLE_PATH, COMPONENT_NAME);
final Attributes attrs = new Attributes(sourceElement);
/*
* MenuItem component structure.
* In order of nesting.
*/
nsIDOMElement itemMainLI;
nsIDOMElement itemTopDiv;
nsIDOMElement itemIconImgSpan;
nsIDOMElement itemIconImg;
nsIDOMElement itemLabelSpan;
nsIDOMText itemLabelText;
/*
* Creating visual elements
*/
itemMainLI = visualDocument.createElement(HTML.TAG_LI);
itemTopDiv = visualDocument.createElement(HTML.TAG_DIV);
itemIconImgSpan = visualDocument.createElement(HTML.TAG_SPAN);
itemIconImg = visualDocument.createElement(HTML.TAG_IMG);
itemLabelSpan = visualDocument.createElement(HTML.TAG_SPAN);
itemLabelText = visualDocument.createTextNode(Constants.EMPTY);
creationData = new VpeCreationData(itemMainLI);
/*
* Nesting elements
*/
itemTopDiv.appendChild(itemIconImgSpan);
itemTopDiv.appendChild(itemLabelSpan);
itemLabelSpan.appendChild(itemLabelText);
itemMainLI.appendChild(itemTopDiv);
/*
* Setting attributes for the drop-down mechanism
*/
itemMainLI.setAttribute(MENU_CHILD_ID, Constants.EMPTY);
/*
* Setting css classes
*/
String topDivClass = Constants.EMPTY;
String iconImgSpanClass = Constants.EMPTY;
String labelSpanClass = Constants.EMPTY;
topDivClass += Constants.WHITE_SPACE+ CSS_RICH_MENU_ITEM;
iconImgSpanClass += Constants.WHITE_SPACE + CSS_RICH_MENU_ITEM_ICON;
labelSpanClass += Constants.WHITE_SPACE + CSS_RICH_MENU_ITEM_LABEL;
if (ComponentUtil.isNotBlank(attrs.getStyleClass())) {
topDivClass += Constants.WHITE_SPACE + attrs.getStyleClass();
}
if (ComponentUtil.isNotBlank(attrs.getIconClass())) {
iconImgSpanClass += Constants.WHITE_SPACE + attrs.getIconClass();
}
if (ComponentUtil.isNotBlank(attrs.getLabelClass())) {
labelSpanClass += Constants.WHITE_SPACE + attrs.getLabelClass();
}
// itemTopDiv.setAttribute(HTML.ATTR_CLASS, topDivClass);
itemTopDiv.setAttribute(HTML.ATTR_CLASS, CSS_MENU_ITEM_TOP_DIV);
itemMainLI.setAttribute(HTML.ATTR_CLASS, topDivClass);
itemIconImgSpan.setAttribute(HTML.ATTR_CLASS, iconImgSpanClass);
itemLabelSpan.setAttribute(HTML.ATTR_CLASS, labelSpanClass);
/*
* Setting css styles
*/
String topDivStyle = Constants.EMPTY;
if (ComponentUtil.isNotBlank(attrs.getStyle())) {
topDivStyle += Constants.WHITE_SPACE + attrs.getStyle();
}
// itemTopDiv.setAttribute(HTML.ATTR_STYLE, topDivStyle);
itemMainLI.setAttribute(HTML.ATTR_STYLE, topDivStyle);
/*
* Encode icon facets
*/
Element iconFacet = ComponentUtil.getFacet(sourceElement, ICON_FACET_NAME);
// Element iconDisabledFacet = ComponentUtil.getFacet(sourceElement, ICON_DISABLED_FACET_NAME);
if (null != iconFacet) {
VpeChildrenInfo childInfo = new VpeChildrenInfo(itemIconImgSpan);
childInfo.addSourceChild(iconFacet);
creationData.addChildrenInfo(childInfo);
} else {
if (ComponentUtil.isNotBlank(attrs.getIcon())) {
/*
* Add path to specified image
*/
String imgFullPath = VpeStyleUtil.addFullPathToImgSrc(attrs.getIcon(), pageContext, true);
itemIconImg.setAttribute(HTML.ATTR_SRC, imgFullPath);
} else {
/*
* Create spacer image
*/
ComponentUtil.setImg(itemIconImg, SPACER_IMG_PATH);
}
/*
* Add image to span
*/
itemIconImgSpan.appendChild(itemIconImg);
}
/*
* Encode label and icon value
*/
String labelValue = Constants.EMPTY;
if (ComponentUtil.isNotBlank(attrs.getValue())) {
labelValue = attrs.getValue();
}
itemLabelText.setNodeValue(labelValue);
/*
* Adding child nodes, including text nodes.
*/
List<Node> children = ComponentUtil.getChildren(sourceElement, true);
for (Node child : children) {
VpeChildrenInfo childInfo = new VpeChildrenInfo(itemLabelSpan);
childInfo.addSourceChild(child);
creationData.addChildrenInfo(childInfo);
}
return creationData;
}
@Override
public boolean recreateAtAttrChange(VpePageContext pageContext,
Element sourceElement, nsIDOMDocument visualDocument,
nsIDOMElement visualNode, Object data, String name, String value) {
return true;
}
class Attributes {
/*
* rich:menuItem attributes names
*/
private String ICON = "icon"; //$NON-NLS-1$
/*
* rich:menuItem css styles and classes attributes names
*/
private String ICON_CLASS = "iconClass"; //$NON-NLS-1$
private String ICON_DISABLED = "iconDisabled"; //$NON-NLS-1$
private String ICON_STYLE = "iconStyle"; //$NON-NLS-1$
private String LABEL_CLASS = "labelClass"; //$NON-NLS-1$
private String SELECT_STYLE = "selectStyle"; //$NON-NLS-1$
private String SELECT_CLASS = "selectClass"; //$NON-NLS-1$
/*
* rich:menuItem attributes
*/
private String mi_disabled;
private String mi_icon;
private String mi_value;
/*
* rich:menuItem css styles and classes attributes
*/
private String mi_iconClass;
private String mi_iconDisabled;
private String mi_iconStyle;
private String mi_labelClass;
private String mi_selectClass;
private String mi_selectStyle;
private String mi_style;
private String mi_styleClass;
public Attributes(final Element sourceElement) {
if (null == sourceElement) {
return;
}
mi_disabled = sourceElement.getAttribute(HTML.ATTR_DISABLED);
mi_icon = sourceElement.getAttribute(ICON);
mi_value = sourceElement.getAttribute(HTML.ATTR_VALUE);
mi_iconClass = sourceElement.getAttribute(ICON_CLASS);
mi_iconDisabled = sourceElement.getAttribute(ICON_DISABLED);
mi_iconStyle = sourceElement.getAttribute(ICON_STYLE);
mi_labelClass = sourceElement.getAttribute(LABEL_CLASS);
mi_selectClass = sourceElement.getAttribute(SELECT_CLASS);
mi_selectStyle = sourceElement.getAttribute(SELECT_STYLE);
mi_style = sourceElement.getAttribute(HTML.ATTR_STYLE);
mi_styleClass = sourceElement.getAttribute(RichFaces.ATTR_STYLE_CLASS);
}
public String getIconClass() {
return mi_iconClass;
}
public String getLabelClass() {
return mi_labelClass;
}
public String getStyle() {
return mi_style;
}
public String getStyleClass() {
return mi_styleClass;
}
public String getIcon() {
return mi_icon;
}
public String getValue() {
return mi_value;
}
}
}