/*******************************************************************************
* 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 RichFacesMenuGroupTemplate extends VpeAbstractTemplate {
/*
* rich:menuGroup constants
*/
private static final String COMPONENT_NAME = "menuGroup"; //$NON-NLS-1$
private static final String STYLE_PATH = "menuGroup/menuGroup.css"; //$NON-NLS-1$
private static final String SPACER_IMG_PATH = "menuGroup/spacer.gif"; //$NON-NLS-1$
private static final String FOLDER_IMG_PATH = "menuGroup/arrow.gif"; //$NON-NLS-1$
private static final String FOLDER_IMG_WIDTH = "16px;"; //$NON-NLS-1$
private static final String FOLDER_IMG_HEIGHT = "16px;"; //$NON-NLS-1$
private static final String CHILD_GROUP_NAME = ":menuGroup"; //$NON-NLS-1$
private static final String CHILD_ITEM_NAME = ":menuItem"; //$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_PARENT_ID = "vpe-ddm-menu-ul"; //$NON-NLS-1$
private static final String MENU_CHILD_ID = "vpe-ddm-menu-li"; //$NON-NLS-1$
/*
* rich:menuGroup css styles names
*/
private static final String CSS_RICH_MENU_GROUP = "rich-menu-group"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_GROUP_LABEL = "rich-menu-group-label"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_GROUP_FOLDER = "rich-menu-group-folder"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_GROUP_HOVER = "rich-menu-group-over"; //$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_FOLDER = "rich-menu-item-folder"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_ITEM_LABEL_DISABLED = "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_FOLDER_DISABLED = "rich-menu-item-folder-disabled"; //$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_ICON_SELECTED = "rich-menu-item-icon-selected"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_LIST_BORDER = "rich-menu-list-border"; //$NON-NLS-1$
private static final String CSS_RICH_MENU_LIST_BG = "rich-menu-list-bg"; //$NON-NLS-1$
private static final String CSS_RICH_LIST_FOLDER_DIV_STYLE = ""; //$NON-NLS-1$
private static final String CSS_RICH_LIST_BORDER_DIV_STYLE = ""; //$NON-NLS-1$
private static final String CSS_MENU_GROUP_TOP_DIV = "dr-menu-group-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);
/*
* MenuGroup component structure.
* In order of nesting.
*/
nsIDOMElement ddmMainUL;
nsIDOMElement grMainLI;
nsIDOMElement grChildrenUL;
nsIDOMElement ddmChildrenLI;
nsIDOMElement grTopDiv;
nsIDOMElement grImgSpan;
nsIDOMElement grImg;
nsIDOMElement grFolderImg;
nsIDOMElement grLabelSpan;
nsIDOMText grLabelText;
nsIDOMElement grFolderImgSpan;
nsIDOMElement grListBorderDiv;
nsIDOMElement grListBgDiv;
/*
* Creating visual elements
*/
grMainLI = visualDocument.createElement(HTML.TAG_LI);
grChildrenUL = visualDocument.createElement(HTML.TAG_UL);
grTopDiv = visualDocument.createElement(HTML.TAG_DIV);
grImgSpan = visualDocument.createElement(HTML.TAG_SPAN);
grImg = visualDocument.createElement(HTML.TAG_IMG);
grFolderImg = visualDocument.createElement(HTML.TAG_IMG);
grLabelSpan = visualDocument.createElement(HTML.TAG_SPAN);
grLabelText = visualDocument.createTextNode(Constants.EMPTY);
grFolderImgSpan = visualDocument.createElement(HTML.TAG_SPAN);
grListBorderDiv = visualDocument.createElement(HTML.TAG_DIV);
grListBgDiv = visualDocument.createElement(HTML.TAG_DIV);
creationData = new VpeCreationData(grMainLI);
/*
* Nesting elements
*/
grTopDiv.appendChild(grImgSpan);
grTopDiv.appendChild(grLabelSpan);
grLabelSpan.appendChild(grLabelText);
grTopDiv.appendChild(grFolderImgSpan);
// grFolderDiv.appendChild(grListBorderDiv);
// grListBorderDiv.appendChild(grListBgDiv);
grMainLI.appendChild(grTopDiv);
/*
* Setting attributes for the drop-down mechanism
*/
grMainLI.setAttribute(MENU_CHILD_ID, Constants.EMPTY);
grChildrenUL.setAttribute(MENU_PARENT_ID, Constants.EMPTY);
/*
* Setting css classes
*/
String topDivClass = Constants.EMPTY;
String imgSpanClass = Constants.EMPTY;
String labelSpanClass = Constants.EMPTY;
String folderDivClass = Constants.EMPTY;
topDivClass += Constants.WHITE_SPACE + CSS_RICH_MENU_GROUP;
imgSpanClass += Constants.WHITE_SPACE + CSS_RICH_MENU_ITEM_ICON_ENABLED;
labelSpanClass += Constants.WHITE_SPACE + CSS_RICH_MENU_ITEM_LABEL + Constants.WHITE_SPACE + CSS_RICH_MENU_GROUP_LABEL;
folderDivClass += Constants.WHITE_SPACE + CSS_RICH_MENU_ITEM_FOLDER + Constants.WHITE_SPACE + CSS_RICH_MENU_GROUP_FOLDER;
if (ComponentUtil.isNotBlank(attrs.getStyleClass())) {
topDivClass += Constants.WHITE_SPACE + attrs.getStyleClass();
}
if (ComponentUtil.isNotBlank(attrs.getIconClass())) {
imgSpanClass += Constants.WHITE_SPACE + attrs.getIconClass();
folderDivClass += Constants.WHITE_SPACE + attrs.getIconClass();
}
if (ComponentUtil.isNotBlank(attrs.getLabelClass())) {
labelSpanClass += Constants.WHITE_SPACE + attrs.getLabelClass();
}
// grTopDiv.setAttribute(HTML.ATTR_CLASS, topDivClass);
grTopDiv.setAttribute(HTML.ATTR_CLASS, CSS_MENU_GROUP_TOP_DIV);
grMainLI.setAttribute(HTML.ATTR_CLASS, topDivClass);
grImgSpan.setAttribute(HTML.ATTR_CLASS, imgSpanClass);
grLabelSpan.setAttribute(HTML.ATTR_CLASS, labelSpanClass);
grFolderImgSpan.setAttribute(HTML.ATTR_CLASS, folderDivClass);
// grListBorderDiv.setAttribute(HTML.ATTR_CLASS, CSS_RICH_MENU_LIST_BORDER);
// grListBgDiv.setAttribute(HTML.ATTR_CLASS, CSS_RICH_MENU_LIST_BG);
grChildrenUL.setAttribute(HTML.ATTR_CLASS, CSS_RICH_MENU_LIST_BORDER
+ Constants.WHITE_SPACE + CSS_RICH_MENU_LIST_BG);
/*
* Setting css styles
*/
String topDivStyle = Constants.EMPTY;
if (ComponentUtil.isNotBlank(attrs.getStyle())) {
topDivStyle += Constants.WHITE_SPACE + attrs.getStyle();
}
grMainLI.setAttribute(HTML.ATTR_STYLE, topDivStyle);
grFolderImgSpan.setAttribute(HTML.ATTR_STYLE, CSS_RICH_LIST_FOLDER_DIV_STYLE);
// grListBorderDiv.setAttribute(HTML.ATTR_STYLE, CSS_RICH_LIST_BORDER_DIV_STYLE);
// grChildrenUL.setAttribute(HTML.ATTR_STYLE,
// CSS_RICH_LIST_FOLDER_DIV_STYLE + Constants.WHITE_SPACE
// + CSS_RICH_LIST_BORDER_DIV_STYLE);
/*
* Encode label value
*/
String labelValue = Constants.EMPTY;
if (ComponentUtil.isNotBlank(attrs.getValue())) {
labelValue = attrs.getValue();
}
grLabelText.setNodeValue(labelValue);
/*
* 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(grImgSpan);
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);
grImg.setAttribute(HTML.ATTR_SRC, imgFullPath);
} else {
/*
* Create spacer image
*/
ComponentUtil.setImg(grImg, SPACER_IMG_PATH);
}
/*
* Add image to span
*/
grImgSpan.appendChild(grImg);
}
/*
* Add group folder icon
*/
if (ComponentUtil.isNotBlank(attrs.getIconFolder())) {
/*
* Add path to specified image
*/
String imgFullPath = VpeStyleUtil.addFullPathToImgSrc(attrs.getIconFolder(), pageContext, true);
grFolderImg.setAttribute(HTML.ATTR_SRC, imgFullPath);
} else {
/*
* Create default arrow image
*/
ComponentUtil.setImg(grFolderImg, FOLDER_IMG_PATH);
}
/*
* Add image to group folder div
*/
grFolderImgSpan.appendChild(grFolderImg);
/*
* Adding child nodes:
* <rich:menuGroup> and <rich:menuItem> only.
*/
List<Node> children = ComponentUtil.getChildren(sourceElement);
boolean missingChildContainer = true;
for (Node child : children) {
if (child.getNodeType() == Node.ELEMENT_NODE
&& (child.getNodeName().endsWith(CHILD_GROUP_NAME)
|| child.getNodeName().endsWith(CHILD_ITEM_NAME))) {
if (missingChildContainer) {
/*
* Add children <ul> tag.
*/
grMainLI.appendChild(grChildrenUL);
missingChildContainer = false;
}
VpeChildrenInfo childDivInfo = new VpeChildrenInfo(grChildrenUL);
childDivInfo.addSourceChild(child);
creationData.addChildrenInfo(childDivInfo);
}
}
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:menuGroup attributes names
*/
private String DIRECTION = "direction"; //$NON-NLS-1$
private String ICON = "icon"; //$NON-NLS-1$
private String ICON_DISABLED = "iconDisabled"; //$NON-NLS-1$
private String ICON_FOLDER = "iconFolder"; //$NON-NLS-1$
private String ICON_FOLDER_DISABLED = "iconFolderDisabled"; //$NON-NLS-1$
/*
* rich:menuGroup css styles and classes attributes names
*/
private String ICON_CLASS = "iconClass"; //$NON-NLS-1$
private String ICON_STYLE = "iconStyle"; //$NON-NLS-1$
private String LABEL_CLASS = "labelClass"; //$NON-NLS-1$
private String SELECT_CLASS = "selectClass"; //$NON-NLS-1$
private String SELECT_STYLE = "selectStyle"; //$NON-NLS-1$
/*
* rich:menuGroup attributes
*/
private String mg_icon;
private String mg_iconFolder;
private String mg_direction;
private String mg_disabled;
private String mg_iconDisabled;
private String mg_iconFolderDisabled;
private String mg_value;
/*
* rich:menuGroup css styles and classes attributes
*/
private String mg_iconClass;
private String mg_iconStyle;
private String mg_labelClass;
private String mg_selectClass;
private String mg_selectStyle;
private String mg_style;
private String mg_styleClass;
public Attributes(final Element sourceElement) {
if (null == sourceElement) {
return;
}
mg_direction = sourceElement.getAttribute(DIRECTION);
mg_disabled = sourceElement.getAttribute(HTML.ATTR_DISABLED);
mg_icon = sourceElement.getAttribute(ICON);
mg_iconDisabled = sourceElement.getAttribute(ICON_DISABLED);
mg_iconFolder = sourceElement.getAttribute(ICON_FOLDER);
mg_iconFolderDisabled = sourceElement.getAttribute(ICON_FOLDER_DISABLED);
mg_value = sourceElement.getAttribute(HTML.ATTR_VALUE);
mg_iconClass = sourceElement.getAttribute(ICON_CLASS);
mg_iconStyle = sourceElement.getAttribute(ICON_STYLE);
mg_labelClass = sourceElement.getAttribute(LABEL_CLASS);
mg_selectClass = sourceElement.getAttribute(SELECT_CLASS);
mg_selectStyle = sourceElement.getAttribute(SELECT_STYLE);
mg_style = sourceElement.getAttribute(HTML.ATTR_STYLE);
mg_styleClass = sourceElement.getAttribute(RichFaces.ATTR_STYLE_CLASS);
}
public String getIconClass() {
return mg_iconClass;
}
public String getLabelClass() {
return mg_labelClass;
}
public String getStyle() {
return mg_style;
}
public String getStyleClass() {
return mg_styleClass;
}
public String getIcon() {
return mg_icon;
}
public String getIconFolder() {
return mg_iconFolder;
}
public String getIconStyle() {
return mg_iconStyle;
}
public String getValue() {
return mg_value;
}
}
}