/*******************************************************************************
* 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.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 RichFacesDropDownMenuTemplate extends VpeAbstractTemplate {
/*
* rich:dropDownMenu constants
*/
private static final String COMPONENT_NAME = "dropDownMenu"; //$NON-NLS-1$
private static final String STYLE_PATH = "dropDownMenu/dropDownMenu.css"; //$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 LABEL_FACET_NAME = "label"; //$NON-NLS-1$
private static final String DEFAULT_DDM_TITLE = "rich:dropDownMenu"; //$NON-NLS-1$
/*
* Constants for drop down mechanism.
*/
private static final String MENU_TOP_ID = "vpe-ddm-menu-title-ul"; //$NON-NLS-1$
private static final String MENU_TOP_ITEM_ID = "vpe-ddm-menu-title-li"; //$NON-NLS-1$
private static final String MENU_CHILDREN_LIST_ID = "vpe-ddm-menu-children-ul"; //$NON-NLS-1$
/*
* rich:dropDownMenu css styles names
*/
private static final String CSS_RICH_DDMENU_LABEL = "rich-ddmenu-label"; //$NON-NLS-1$
private static final String CSS_RICH_DDMENU_LABEL_UNSELECT = "rich-ddmenu-label-unselect"; //$NON-NLS-1$
private static final String CSS_RICH_DDMENU_LABEL_SELECT = "rich-ddmenu-label-select"; //$NON-NLS-1$
private static final String CSS_RICH_DDMENU_LABEL_DISABLED = "rich-ddmenu-label-disabled"; //$NON-NLS-1$
private static final String CSS_RICH_LABEL_TEXT_DECOR = "rich-label-text-decor"; //$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_DDEMENU_LIST_DIV_STYLE = ""; //$NON-NLS-1$
private static final String CSS_RICH_DDEMENU_BORDER_DIV_STYLE = ""; //$NON-NLS-1$
private static final String CSS_MENU_TOP_DIV = "dr-menu-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);
/*
* DropDownMenu component structure.
* In order of nesting.
*/
nsIDOMElement ddmMainUL;
nsIDOMElement ddmMainLI;
nsIDOMElement ddmChildrenUL;
nsIDOMElement ddmLabelDiv;
nsIDOMElement ddmTextSpan;
nsIDOMText ddmLabelText;
nsIDOMElement ddmListDiv;
nsIDOMElement ddmListBorderDiv;
nsIDOMElement ddmListBgDiv;
/*
* Creating visual elements
*/
ddmMainUL = visualDocument.createElement(HTML.TAG_UL);
ddmMainLI = visualDocument.createElement(HTML.TAG_LI);
ddmChildrenUL = visualDocument.createElement(HTML.TAG_UL);
ddmLabelDiv = visualDocument.createElement(HTML.TAG_DIV);
ddmTextSpan = visualDocument.createElement(HTML.TAG_SPAN);
ddmLabelText = visualDocument.createTextNode(Constants.EMPTY);
ddmListDiv = visualDocument.createElement(HTML.TAG_DIV);
ddmListBorderDiv = visualDocument.createElement(HTML.TAG_DIV);
ddmListBgDiv = visualDocument.createElement(HTML.TAG_DIV);
creationData = new VpeCreationData(ddmMainUL);
/*
* Nesting elements
*/
ddmLabelDiv.appendChild(ddmTextSpan);
// ddmTextSpan.appendChild(ddmLabelText);
// ddmLabelDiv.appendChild(ddmListDiv);
ddmListDiv.appendChild(ddmListBorderDiv);
ddmListBorderDiv.appendChild(ddmListBgDiv);
ddmMainUL.appendChild(ddmMainLI);
ddmMainLI.appendChild(ddmLabelDiv);
/*
* Setting attributes for the drop-down mechanism
*/
ddmMainUL.setAttribute(MENU_TOP_ID, Constants.EMPTY);
ddmMainLI.setAttribute(MENU_TOP_ITEM_ID, Constants.EMPTY);
ddmChildrenUL.setAttribute(MENU_CHILDREN_LIST_ID, Constants.EMPTY);
/*
* Setting css classes
*/
String labelDivClass = Constants.EMPTY;
String listBorderDivClass = Constants.EMPTY;
labelDivClass += Constants.WHITE_SPACE + CSS_RICH_DDMENU_LABEL + Constants.WHITE_SPACE
+ CSS_RICH_DDMENU_LABEL_UNSELECT;
listBorderDivClass += Constants.WHITE_SPACE + CSS_RICH_MENU_LIST_BORDER;
if (ComponentUtil.isNotBlank(attrs.getStyleClass())) {
labelDivClass += Constants.WHITE_SPACE + attrs.getStyleClass();
listBorderDivClass += Constants.WHITE_SPACE + attrs.getStyleClass();
}
// ddmLabelDiv.setAttribute(HTML.ATTR_CLASS, labelDivClass);
ddmLabelDiv.setAttribute(HTML.ATTR_CLASS, CSS_MENU_TOP_DIV);
ddmMainLI.setAttribute(HTML.ATTR_CLASS, labelDivClass);
ddmTextSpan.setAttribute(HTML.ATTR_CLASS, CSS_RICH_LABEL_TEXT_DECOR);
// ddmListBorderDiv.setAttribute(HTML.ATTR_CLASS, listBorderDivClass);
// ddmListBgDiv.setAttribute(HTML.ATTR_CLASS, CSS_RICH_MENU_LIST_BG);
ddmChildrenUL.setAttribute(HTML.ATTR_CLASS, listBorderDivClass + Constants.WHITE_SPACE
+ CSS_RICH_MENU_LIST_BG);
/*
* Setting css styles
*/
String cssListDivStyle = Constants.EMPTY;
String cssListBorderDivStyle = Constants.EMPTY;
String cssLabelDivStyle = Constants.EMPTY;
cssListDivStyle += Constants.WHITE_SPACE + CSS_RICH_DDEMENU_LIST_DIV_STYLE;
cssListBorderDivStyle += Constants.WHITE_SPACE + CSS_RICH_DDEMENU_BORDER_DIV_STYLE;
if (ComponentUtil.isNotBlank(attrs.getStyle())) {
cssLabelDivStyle += Constants.WHITE_SPACE + attrs.getStyle();
}
// ddmListDiv.setAttribute(HTML.ATTR_STYLE, cssListDivStyle);
// ddmListBorderDiv.setAttribute(HTML.ATTR_STYLE, cssListBorderDivStyle);
// ddmLabelDiv.setAttribute(HTML.ATTR_STYLE, cssLabelDivStyle);
ddmMainLI.setAttribute(HTML.ATTR_STYLE, cssListDivStyle + Constants.WHITE_SPACE
+ cssListBorderDivStyle + Constants.WHITE_SPACE + cssLabelDivStyle);
ddmChildrenUL.setAttribute(HTML.ATTR_STYLE, cssListDivStyle + Constants.WHITE_SPACE
+ cssListBorderDivStyle + Constants.WHITE_SPACE + cssLabelDivStyle);
/*
* Encoding label value
*/
Element labelFacet = ComponentUtil.getFacet(sourceElement, LABEL_FACET_NAME);
if (null != labelFacet) {
VpeChildrenInfo childrenInfo = new VpeChildrenInfo(ddmTextSpan);
childrenInfo.addSourceChild(labelFacet);
creationData.addChildrenInfo(childrenInfo);
} else {
String labelValue = DEFAULT_DDM_TITLE;
if (ComponentUtil.isNotBlank(attrs.getValue())) {
labelValue = attrs.getValue();
}
ddmLabelText.setNodeValue(labelValue);
ddmTextSpan.appendChild(ddmLabelText);
}
/*
* 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.
*/
ddmMainLI.appendChild(ddmChildrenUL);
missingChildContainer = false;
}
VpeChildrenInfo childDivInfo = new VpeChildrenInfo(
ddmChildrenUL);
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:dropDownMenu attributes names
*/
private String DIRECTION = "direction"; //$NON-NLS-1$
private String HORIZONTAL_OFFCET = "horizontalOffset"; //$NON-NLS-1$
private String JOINT_POINT = "jontPoint"; //$NON-NLS-1$
private String POPUP_WIDTH = "popupWidth"; //$NON-NLS-1$
private String VERTICAL_OFFSET = "verticalOffset"; //$NON-NLS-1$
/*
* rich:menuGroup css styles and classes attributes names
*/
private String DISABLED_ITEM_CLASS = "disabledItemClass"; //$NON-NLS-1$
private String DISABLED_ITEM_STYLE = "disabledItemStyle"; //$NON-NLS-1$
private String DISABLED_LABEL_CLASS = "disabledLabelClass"; //$NON-NLS-1$
private String ITEM_CLASS = "itemClass"; //$NON-NLS-1$
private String ITEM_STYLE = "itemStyle"; //$NON-NLS-1$
private String SELECED_LABEL_CLASS = "selectedLabelClass"; //$NON-NLS-1$
private String SELECT_ITEM_CLASS = "selectItemClass"; //$NON-NLS-1$
/*
* rich:dropDownMenu attributes
*/
private String ddm_direction;
private String ddm_disabled;
private String ddm_horizontalOffset;
private String ddm_jointPoint;
private String ddm_popupWidth;
private String ddm_verticalOffset;
/*
* rich:dropDownMenu css styles and classes attributes
*/
private String ddm_disabledItemClass;
private String ddm_disabledItemStyle;
private String ddm_disabledLabelClass;
private String ddm_itemClass;
private String ddm_itemStyle;
private String ddm_selectedLabelClass;
private String ddm_selectItemClass;
private String ddm_style;
private String ddm_styleClass;
private String ddm_value;
public Attributes(final Element sourceElement) {
if (null == sourceElement) {
return;
}
ddm_direction = sourceElement.getAttribute(DIRECTION);
ddm_disabled = sourceElement.getAttribute(HTML.ATTR_DISABLED);
ddm_horizontalOffset = sourceElement.getAttribute(HORIZONTAL_OFFCET);
ddm_jointPoint = sourceElement.getAttribute(JOINT_POINT);
ddm_popupWidth = sourceElement.getAttribute(POPUP_WIDTH);
ddm_verticalOffset = sourceElement.getAttribute(VERTICAL_OFFSET);
ddm_disabledItemClass = sourceElement.getAttribute(DISABLED_ITEM_CLASS);
ddm_disabledItemStyle = sourceElement.getAttribute(DISABLED_ITEM_STYLE);
ddm_disabledLabelClass = sourceElement.getAttribute(DISABLED_LABEL_CLASS);
ddm_itemClass = sourceElement.getAttribute(ITEM_CLASS);
ddm_itemStyle = sourceElement.getAttribute(ITEM_STYLE);
ddm_selectedLabelClass = sourceElement.getAttribute(SELECED_LABEL_CLASS);
ddm_selectItemClass = sourceElement.getAttribute(SELECT_ITEM_CLASS);
ddm_style = sourceElement.getAttribute(HTML.ATTR_STYLE);
ddm_styleClass = sourceElement.getAttribute(RichFaces.ATTR_STYLE_CLASS);
ddm_value = sourceElement.getAttribute(HTML.ATTR_VALUE);
}
public String getStyle() {
return ddm_style;
}
public String getStyleClass() {
return ddm_styleClass;
}
public String getDisabled() {
return ddm_disabled;
}
public String getValue() {
return ddm_value;
}
}
}