/******************************************************************************* * Copyright (c) 2007 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.jsf.vpe.richfaces.template; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil; import org.jboss.tools.jsf.vpe.richfaces.template.RichFacesFileUploadTemplate.StyleClasses; import org.jboss.tools.vpe.editor.VpeSourceDomBuilder; import org.jboss.tools.vpe.editor.VpeVisualDomBuilder; 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.template.VpeToggableTemplate; import org.jboss.tools.vpe.editor.util.Constants; import org.jboss.tools.vpe.editor.util.HTML; import org.jboss.tools.vpe.editor.util.ResourceUtil; 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.Attr; import org.w3c.dom.Element; import org.w3c.dom.Node; public class RichFacesPanelMenuGroupTemplate extends VpeAbstractTemplate implements VpeToggableTemplate { public static final String VPE_EXPANDED_TOGGLE_IDS = "vpe-expanded-toggle-ids"; //$NON-NLS-1$ public static final String GROUP_COUNT_SEPARATOR = "-"; //$NON-NLS-1$ public static final Map<String, String> DEFAULT_ICON_MAP = new HashMap<String, String>(); /* * pich:panelMenuGroup attributes */ private static final String DISABLED_CLASS = "disabledClass"; //$NON-NLS-1$ private static final String DISABLED_STYLE = "disabledStyle"; //$NON-NLS-1$ private static final String ICON_CLASS = "iconClass"; //$NON-NLS-1$ private static final String ICON_STYLE = "iconStyle"; //$NON-NLS-1$ private static final String ICON_EXPANDED = "iconExpanded"; //$NON-NLS-1$ private static final String ICON_COLLAPSED = "iconCollapsed"; //$NON-NLS-1$ private static final String ICON_DISABLED = "iconDisabled"; //$NON-NLS-1$ private static final String LABEL = "label"; //$NON-NLS-1$ private static final String STYLE = "style"; //$NON-NLS-1$ private static final String STYLE_CLASS = "styleClass"; //$NON-NLS-1$ /* * rich:panelMenuGroup css styles */ private static final String CSS_DR_TOP_GROUP_DIV = "dr-pmenu-top-group-div"; //$NON-NLS-1$ private static final String CSS_DR_TOP_GROUP = "dr-pmenu-top-group"; //$NON-NLS-1$ private static final String CSS_DR_GROUP = "dr-pmenu-group"; //$NON-NLS-1$ private static final String CSS_TOP_GROUP_ICON = "rich-pmenu-top-group-self-icon"; //$NON-NLS-1$ private static final String CSS_TOP_GROUP_LABEL = "rich-pmenu-top-group-self-label"; //$NON-NLS-1$ private static final String CSS_DR_GROUP_DIV = "dr-pmenu-group-div"; //$NON-NLS-1$ private static final String CSS_GROUP = "rich-pmenu-group"; //$NON-NLS-1$ private static final String CSS_TOP_GROUP = "rich-pmenu-top-group"; //$NON-NLS-1$ private static final String CSS_TOP_GROUP_DIV = "rich-pmenu-top-group-div"; //$NON-NLS-1$ private static final String CSS_GROUP_ICON = "rich-pmenu-group-self-icon"; //$NON-NLS-1$ private static final String CSS_GROUP_LABEL = "rich-pmenu-group-self-label"; //$NON-NLS-1$ private static final String CSS_HOVERED_ELEMENT = "rich-pmenu-hovered-element"; //$NON-NLS-1$ private static final String CSS_DISABLED_ELEMENT = "rich-pmenu-disabled-element"; //$NON-NLS-1$ private static final String NAME_COMPONENT = "panelMenuGroup"; //$NON-NLS-1$ private static final String PANEL_MENU_END_TAG = ":panelMenu"; //$NON-NLS-1$ private static final String PANEL_MENU_GROUP_END_TAG = ":panelMenuGroup"; //$NON-NLS-1$ private static final String PANEL_MENU_ITEM_END_TAG = ":panelMenuItem"; //$NON-NLS-1$ private static final String COMPONENT_ATTR_VPE_SUPPORT = "vpeSupport"; //$NON-NLS-1$ private static final String PANEL_MENU_GROUP_ICON_SPACER_PATH = "/panelMenuGroup/spacer.gif"; //$NON-NLS-1$ private static final String STYLE_PATH = "/panelMenuGroup/style.css"; //$NON-NLS-1$ private static final String VSPACE = "vspace"; //$NON-NLS-1$ private static final String HSPACE = "hspace"; //$NON-NLS-1$ private static final String TRUE = "true"; //$NON-NLS-1$ private static final String RIGHT = "right"; //$NON-NLS-1$ private static final String LEFT = "right"; //$NON-NLS-1$ private static final String WIDTH_100_PERSENTS = "width: 100%; "; //$NON-NLS-1$ private static final String DEFAULT_SIZE_VALUE = "16"; //$NON-NLS-1$ private List<String> expandedIds = new ArrayList<String>(); static { DEFAULT_ICON_MAP.put("chevron", "/panelMenuGroup/chevron.gif"); //$NON-NLS-1$ //$NON-NLS-2$ DEFAULT_ICON_MAP.put("chevronUp", "/panelMenuGroup/chevronUp.gif"); //$NON-NLS-1$ //$NON-NLS-2$ DEFAULT_ICON_MAP.put("chevronDown", "/panelMenuGroup/chevronDown.gif"); //$NON-NLS-1$ //$NON-NLS-2$ DEFAULT_ICON_MAP.put("triangle", "/panelMenuGroup/triangle.gif"); //$NON-NLS-1$ //$NON-NLS-2$ DEFAULT_ICON_MAP.put("triangleUp", "/panelMenuGroup/triangleUp.gif"); //$NON-NLS-1$ //$NON-NLS-2$ DEFAULT_ICON_MAP .put("triangleDown", "/panelMenuGroup/triangleDown.gif"); //$NON-NLS-1$ //$NON-NLS-2$ DEFAULT_ICON_MAP.put("disc", "/panelMenuGroup/disc.gif"); //$NON-NLS-1$ //$NON-NLS-2$ DEFAULT_ICON_MAP.put("grid", "/panelMenuGroup/grid.gif"); //$NON-NLS-1$ //$NON-NLS-2$ } @SuppressWarnings("unchecked") public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { Element groupSourceElement = (Element) sourceNode; expandedIds = (List<String>) groupSourceElement.getUserData(VPE_EXPANDED_TOGGLE_IDS); String childId = (String) groupSourceElement.getUserData(VpeVisualDomBuilder.VPE_USER_TOGGLE_ID); /* * Counts child groups in a parent group */ int childGroupCount = 1; Element anySuitableParent = getGroupParent(groupSourceElement, false); Element panelMenuParent = getGroupParent(groupSourceElement, true); final Attributes attrs = new Attributes(groupSourceElement, panelMenuParent); ComponentUtil.setCSSLink(pageContext, STYLE_PATH, NAME_COMPONENT); boolean expanded = false; if (null != expandedIds) { expanded = expandedIds.contains(childId); } nsIDOMElement div = visualDocument .createElement(HTML.TAG_DIV); VpeCreationData creationData = new VpeCreationData(div); div.setAttribute(COMPONENT_ATTR_VPE_SUPPORT, NAME_COMPONENT); div.setAttribute(VpeVisualDomBuilder.VPE_USER_TOGGLE_ID, childId); buildTable(pageContext, anySuitableParent, panelMenuParent, groupSourceElement, visualDocument, div, expanded, childId, attrs); nsIDOMElement childSpan = visualDocument .createElement(HTML.TAG_SPAN); VpeChildrenInfo childrenInfo = new VpeChildrenInfo(childSpan); List<Node> children = null; // if (srcNode != null) { // children = ComponentUtil.getChildren((Element) groupSourceElement.getUserData(VpeVisualDomBuilder.SRC_NODE)); // } else { children = ComponentUtil.getChildren(groupSourceElement); // } if (expanded) { for (Node child : children) { boolean isGroup = child.getNodeName().endsWith( PANEL_MENU_GROUP_END_TAG); boolean isItem = child.getNodeName().endsWith( PANEL_MENU_ITEM_END_TAG); if (isGroup) { String newLevelToggleId = childId + GROUP_COUNT_SEPARATOR + childGroupCount; childGroupCount++; child.setUserData(VpeVisualDomBuilder.VPE_USER_TOGGLE_ID, newLevelToggleId, null); child.setUserData(VPE_EXPANDED_TOGGLE_IDS, expandedIds, null); } if (isItem) { child.setUserData(RichFacesPanelMenuItemTemplate.VPE_PANEL_MENU_ITEM_ID, childId, null); } childrenInfo = new VpeChildrenInfo(div); childrenInfo.addSourceChild(child); creationData.addChildrenInfo(childrenInfo); } } if (childrenInfo.getSourceChildren() == null) { creationData.addChildrenInfo(childrenInfo); } return creationData; } private void buildTable(VpePageContext pageContext, Element anySuitableParent, Element panelMenuParent, Element groupSourceElement, nsIDOMDocument visualDocument, nsIDOMElement div, boolean expanded, String activeChildId, Attributes attrs) { String tableStyle = Constants.EMPTY; String tableClass = Constants.EMPTY; String iconCellClass = Constants.EMPTY; String iconCellStyle = Constants.EMPTY; String labelCellClass = Constants.EMPTY; String emptyCellClass = Constants.EMPTY; String divClass = Constants.EMPTY; nsIDOMElement table = visualDocument .createElement(HTML.TAG_TABLE); div.appendChild(table); table.setAttribute(HTML.ATTR_CELLSPACING, Constants.ZERO_STRING); table.setAttribute(HTML.ATTR_CELLPADDING, Constants.ZERO_STRING); table.setAttribute(HTML.ATTR_BORDER, Constants.ZERO_STRING); nsIDOMElement tableBodyRow = visualDocument .createElement(HTML.TAG_TR); table.appendChild(tableBodyRow); /* * Add indentation for nested groups */ List<nsIDOMElement> indentTds = new ArrayList<nsIDOMElement>(); if (activeChildId != null) { String[] ids = activeChildId.split(GROUP_COUNT_SEPARATOR); if (ids.length > 1) { for (int i = 1; i <= ids.length - 1; i++) { nsIDOMElement spacerTd = visualDocument .createElement(HTML.TAG_TD); nsIDOMElement spacerImg = visualDocument .createElement(HTML.TAG_IMG); spacerTd.appendChild(spacerImg); ComponentUtil.setImg(spacerImg, PANEL_MENU_GROUP_ICON_SPACER_PATH); setDefaultImgAttributes(spacerImg); tableBodyRow.appendChild(spacerTd); indentTds.add(spacerTd); } } } nsIDOMElement column1 = visualDocument .createElement(HTML.TAG_TD); column1.setAttribute(VpeVisualDomBuilder.VPE_USER_TOGGLE_ID, activeChildId); tableBodyRow.appendChild(column1); nsIDOMElement column2 = visualDocument .createElement(HTML.TAG_TD); tableBodyRow.appendChild(column2); column2.setAttribute(HTML.ATTR_STYLE, WIDTH_100_PERSENTS); nsIDOMElement column3 = visualDocument .createElement(HTML.TAG_TD); column3.setAttribute(VpeVisualDomBuilder.VPE_USER_TOGGLE_ID, activeChildId); tableBodyRow.appendChild(column3); /* * Group Label Routine. */ Attr labelAttr = null; String labelValue = Constants.EMPTY; String bundleValue = Constants.EMPTY; String resultValue = Constants.EMPTY; if (groupSourceElement.hasAttribute(LABEL)) { labelAttr = groupSourceElement.getAttributeNode(LABEL); } if (null != labelAttr) { labelValue = labelAttr.getNodeValue(); bundleValue = ResourceUtil.getBundleValue(pageContext, labelAttr.getValue()); } if (ComponentUtil.isNotBlank(labelValue)) { if (ComponentUtil.isNotBlank(bundleValue)) { if (!labelValue.equals(bundleValue)) { resultValue = bundleValue; } else { resultValue = labelValue; } } else { resultValue = labelValue; } } else { if (ComponentUtil.isNotBlank(bundleValue)) { resultValue = bundleValue; } else { resultValue = Constants.EMPTY; } } nsIDOMText text = visualDocument.createTextNode(resultValue); column2.appendChild(text); column2.setAttribute(VpeVisualDomBuilder.VPE_USER_TOGGLE_ID, activeChildId); boolean childOfPanelMenu = anySuitableParent != null ? anySuitableParent .getNodeName().endsWith(PANEL_MENU_END_TAG) : false; /* * Group Icon Routine */ nsIDOMElement iconCell = column1; nsIDOMElement emptyCell = column3; if (!childOfPanelMenu && ComponentUtil.isNotBlank(attrs.getPm_iconGroupPosition())) { if (RIGHT.equalsIgnoreCase(attrs.getPm_iconGroupPosition())) { /* * Set icon image on the right */ iconCell = column3; emptyCell = column1; } } if (childOfPanelMenu && ComponentUtil.isNotBlank(attrs.getPm_iconGroupTopPosition())) { if (RIGHT.equalsIgnoreCase(attrs.getPm_iconGroupTopPosition())) { /* * Set icon image on the right */ iconCell = column3; emptyCell = column1; } else if (LEFT.equalsIgnoreCase(attrs.getPm_iconGroupTopPosition())) { iconCell = column1; emptyCell = column3; } } nsIDOMElement imgIcon = visualDocument .createElement(HTML.TAG_IMG); nsIDOMElement imgSpacer = visualDocument .createElement(HTML.TAG_IMG); ComponentUtil.setImg(imgSpacer, PANEL_MENU_GROUP_ICON_SPACER_PATH); setDefaultImgAttributes(imgSpacer); iconCell.appendChild(imgIcon); emptyCell.appendChild(imgSpacer); setIcon(pageContext, panelMenuParent, groupSourceElement, imgIcon, expanded, childOfPanelMenu, attrs); /* * Group Style Classes Routine */ if (childOfPanelMenu) { tableClass += Constants.WHITE_SPACE + CSS_DR_TOP_GROUP + Constants.WHITE_SPACE + CSS_TOP_GROUP + Constants.WHITE_SPACE + CSS_GROUP; divClass += Constants.WHITE_SPACE + CSS_DR_TOP_GROUP_DIV + Constants.WHITE_SPACE + CSS_TOP_GROUP_DIV; } else { tableClass += Constants.WHITE_SPACE + CSS_GROUP + Constants.WHITE_SPACE + CSS_DR_GROUP; divClass += Constants.WHITE_SPACE + CSS_DR_GROUP_DIV; } if (TRUE.equalsIgnoreCase(attrs.getPm_disabled())) { if (childOfPanelMenu) { tableClass += Constants.WHITE_SPACE + CSS_DISABLED_ELEMENT; if (ComponentUtil.isNotBlank(attrs.getPm_disabledGroupClass())) { tableClass += Constants.WHITE_SPACE + attrs.getPm_disabledGroupClass(); } if (ComponentUtil.isNotBlank(attrs.getPm_topGroupStyle())) { tableStyle += Constants.WHITE_SPACE + attrs.getPm_topGroupStyle(); } } } if ((TRUE.equalsIgnoreCase(attrs.getPmg_disabled()))) { if (!(TRUE.equalsIgnoreCase(attrs.getPm_disabled()))) { tableClass += Constants.WHITE_SPACE + CSS_DISABLED_ELEMENT; if (ComponentUtil.isNotBlank(attrs.getPm_disabledGroupClass())){ tableClass += Constants.WHITE_SPACE + attrs.getPm_disabledGroupClass(); } } if (ComponentUtil.isNotBlank(attrs.getPmg_disabledClass())) { tableClass += Constants.WHITE_SPACE + attrs.getPmg_disabledClass(); } if (ComponentUtil.isNotBlank(attrs.getPm_disabledGroupStyle())) { tableStyle += Constants.WHITE_SPACE + attrs.getPm_disabledGroupStyle(); } if (ComponentUtil.isNotBlank(attrs.getPmg_disabledStyle())) { tableStyle += Constants.WHITE_SPACE + attrs.getPmg_disabledStyle(); } } if (!(TRUE.equalsIgnoreCase(attrs.getPm_disabled())) && (!(TRUE.equalsIgnoreCase(attrs.getPmg_disabled())))) { tableClass = Constants.WHITE_SPACE + CSS_DR_GROUP + Constants.WHITE_SPACE + CSS_GROUP; iconCellClass = Constants.WHITE_SPACE + CSS_GROUP_ICON; labelCellClass += Constants.WHITE_SPACE + CSS_GROUP_LABEL; emptyCellClass += Constants.WHITE_SPACE + CSS_GROUP_ICON; if (ComponentUtil.isNotBlank(attrs.getPmg_iconClass())) { iconCellClass += Constants.WHITE_SPACE + attrs.getPmg_iconClass(); } if (ComponentUtil.isNotBlank(attrs.getPmg_iconStyle())) { iconCellStyle += Constants.WHITE_SPACE + attrs.getPmg_iconStyle(); } if (childOfPanelMenu) { tableClass = Constants.WHITE_SPACE + CSS_DR_TOP_GROUP + Constants.WHITE_SPACE + CSS_GROUP; iconCellClass = Constants.WHITE_SPACE + CSS_GROUP_ICON + Constants.WHITE_SPACE + CSS_TOP_GROUP_ICON; labelCellClass = Constants.WHITE_SPACE + CSS_TOP_GROUP_LABEL; emptyCellClass = Constants.WHITE_SPACE + CSS_TOP_GROUP_ICON; if (ComponentUtil.isNotBlank(attrs.getPm_topGroupClass())){ tableClass += Constants.WHITE_SPACE + attrs.getPm_topGroupClass(); } if (ComponentUtil.isNotBlank(attrs.getPm_topGroupStyle())) { tableStyle += attrs.getPm_topGroupStyle(); } if (ComponentUtil.isNotBlank(attrs.getPmg_iconClass())) { iconCellClass += Constants.WHITE_SPACE + attrs.getPmg_iconClass(); } if (ComponentUtil.isNotBlank(attrs.getPmg_iconStyle())) { iconCellStyle += Constants.WHITE_SPACE + attrs.getPmg_iconStyle(); } } else { if (ComponentUtil.isNotBlank(attrs.getPm_groupClass())) { tableClass += Constants.WHITE_SPACE + attrs.getPm_groupClass(); } if (ComponentUtil.isNotBlank(attrs.getPm_groupStyle())) { tableStyle += Constants.WHITE_SPACE + attrs.getPm_groupStyle(); } } } if (ComponentUtil.isNotBlank(attrs.getPmg_styleClass())) { tableClass += Constants.WHITE_SPACE + attrs.getPmg_styleClass(); } if (ComponentUtil.isNotBlank(attrs.getPmg_style())) { tableStyle += Constants.WHITE_SPACE + attrs.getPmg_style(); } iconCell.setAttribute(HTML.ATTR_CLASS, iconCellClass); // iconCell.setAttribute(HtmlComponentUtil.HTML_STYLE_ATTR, iconCellStyle); for (nsIDOMElement indentTdCell : indentTds) { indentTdCell.setAttribute(HTML.ATTR_CLASS, iconCellClass); } column2.setAttribute(HTML.ATTR_CLASS, labelCellClass); emptyCell.setAttribute(HTML.ATTR_CLASS, emptyCellClass); div.setAttribute(HTML.ATTR_CLASS, divClass); table.setAttribute(HTML.ATTR_CLASS, tableClass); table.setAttribute(HTML.ATTR_STYLE, tableStyle); } private static void setDefaultImgAttributes(nsIDOMElement element) { element.setAttribute(HTML.ATTR_WIDTH, DEFAULT_SIZE_VALUE); element.setAttribute(VSPACE, Constants.ZERO_STRING); element.setAttribute(HSPACE, Constants.ZERO_STRING); element.setAttribute(HTML.ATTR_HEIGHT, DEFAULT_SIZE_VALUE); } /** * Gets the panel menu group parent. * * @param sourceElement the source element * @param findOnlyPanelMenuParent flag to find only panel menu parent * * @return the group parent */ private static final Element getGroupParent(Element sourceElement, boolean findOnlyPanelMenuParent) { Element parent = null; Element currentElement = sourceElement; while ((currentElement.getParentNode() != null) && (currentElement.getParentNode().getNodeType() == Node.ELEMENT_NODE)) { currentElement = parent = (Element) currentElement.getParentNode(); if (findOnlyPanelMenuParent) { if ((parent != null) && parent.getNodeName().endsWith(PANEL_MENU_END_TAG)) { break; } } else { if ((parent != null) && parent.getNodeName().endsWith(PANEL_MENU_END_TAG) || parent.getNodeName().endsWith( PANEL_MENU_GROUP_END_TAG)) { break; } } } return parent; } private void setIcon(VpePageContext pageContext, Node panelMenuParent, Element groupSourceElement, nsIDOMElement imgIcon, boolean expanded, boolean childOfPanelMenu, Attributes attrs) { String pathIconExpanded = attrs.getPmg_iconExpanded(); String pathIconCollapsed = attrs.getPmg_iconCollapsed(); String pathIconDisabled = attrs.getPmg_iconDisabled(); if (ComponentUtil.isBlank(pathIconExpanded)) { if (childOfPanelMenu) { pathIconExpanded = attrs.getPm_iconExpandedTopGroup(); } pathIconExpanded = attrs.getPm_iconExpandedGroup(); } if (ComponentUtil.isBlank(pathIconCollapsed)) { if (childOfPanelMenu) { pathIconCollapsed = attrs.getPm_iconCollapsedTopGroup(); } pathIconCollapsed = attrs.getPm_iconCollapsedGroup(); } if (ComponentUtil.isBlank(pathIconDisabled)) { if (childOfPanelMenu) { pathIconDisabled = attrs.getPm_iconTopDisabledGroup(); } pathIconDisabled = attrs.getPm_iconDisabledGroup(); } if (TRUE.equalsIgnoreCase(attrs.getPmg_disabled())) { if (ComponentUtil.isNotBlank(pathIconDisabled)) { if (DEFAULT_ICON_MAP.containsKey(pathIconDisabled)) { pathIconDisabled = DEFAULT_ICON_MAP.get(pathIconDisabled); ComponentUtil.setImg(imgIcon, pathIconDisabled); } else { String imgFullPath = VpeStyleUtil.addFullPathToImgSrc( pathIconDisabled, pageContext, true); imgIcon.setAttribute(HTML.ATTR_SRC, imgFullPath); } } else { ComponentUtil.setImg(imgIcon, PANEL_MENU_GROUP_ICON_SPACER_PATH); } } else { if (expanded) { if (ComponentUtil.isNotBlank(pathIconExpanded)) { if (DEFAULT_ICON_MAP.containsKey(pathIconExpanded)) { pathIconExpanded = DEFAULT_ICON_MAP .get(pathIconExpanded); ComponentUtil.setImg(imgIcon, pathIconExpanded); } else { String imgFullPath = VpeStyleUtil.addFullPathToImgSrc( pathIconExpanded, pageContext, true); imgIcon.setAttribute(HTML.ATTR_SRC, imgFullPath); } } else { ComponentUtil.setImg(imgIcon, PANEL_MENU_GROUP_ICON_SPACER_PATH); } } else { if (ComponentUtil.isNotBlank(pathIconCollapsed)) { if (DEFAULT_ICON_MAP.containsKey(pathIconCollapsed)) { pathIconCollapsed = DEFAULT_ICON_MAP .get(pathIconCollapsed); ComponentUtil.setImg(imgIcon, pathIconCollapsed); } else { String imgFullPath = VpeStyleUtil.addFullPathToImgSrc( pathIconCollapsed, pageContext, true); imgIcon.setAttribute(HTML.ATTR_SRC, imgFullPath); } } else { ComponentUtil.setImg(imgIcon, PANEL_MENU_GROUP_ICON_SPACER_PATH); } } } } /* (non-Javadoc) * @see org.jboss.tools.vpe.editor.template.VpeToggableTemplate#toggle(org.jboss.tools.vpe.editor.VpeVisualDomBuilder, org.w3c.dom.Node, java.lang.String) */ @SuppressWarnings("unchecked") public void toggle(VpeVisualDomBuilder builder, Node sourceNode, String toggleId) { Element groupSourceElement = (Element) sourceNode; Element panelMenuParent = getGroupParent(groupSourceElement, true); String pmg_disabled = groupSourceElement.getAttribute(HTML.ATTR_DISABLED); String pm_disabled = panelMenuParent.getAttribute(HTML.ATTR_DISABLED); String pm_expandSingle = panelMenuParent.getAttribute(RichFacesPanelMenuTemplate.EXPAND_SINGLE); /* * Do nothing when panel menu or panel group are disabled. */ if (TRUE.equalsIgnoreCase(pm_disabled) || TRUE.equalsIgnoreCase(pmg_disabled)) { return; } expandedIds = (List<String>) sourceNode.getUserData(VPE_EXPANDED_TOGGLE_IDS); if (null == expandedIds) { expandedIds = new ArrayList<String>(); } /* * Expand only one group. */ if (TRUE.equalsIgnoreCase(pm_expandSingle)) { if (expandedIds.contains(toggleId)) { /* * Close group and its children */ expandedIds.remove(toggleId); for (Iterator<String> iterator = expandedIds.iterator(); iterator.hasNext();) { String id = iterator.next(); if (id.startsWith(toggleId)) { iterator.remove(); } } } else { /* * Expand new group, close others */ String[] toggleIds = toggleId.split(RichFacesPanelMenuGroupTemplate.GROUP_COUNT_SEPARATOR); if ((null != toggleIds) && (toggleIds.length > 0)) { for (Iterator<String> iterator = expandedIds.iterator(); iterator.hasNext();) { String id = iterator.next(); String[] ids = id.split(RichFacesPanelMenuGroupTemplate.GROUP_COUNT_SEPARATOR); if ((null != ids) && (ids.length > 0)) { if (ids.length >= toggleIds.length) { /* * Remove all ids that are deeper than selected * and that are on the same level. */ iterator.remove(); } else { /* * Remove all ids that are not in the selected branch. */ for (int i = 0; i < ids.length; i++) { if (!ids[i].equalsIgnoreCase(toggleIds[i])) { iterator.remove(); } } } } } } expandedIds.add(toggleId); } } else { /* * Expand any number of groups. */ if (expandedIds.contains(toggleId)) { expandedIds.remove(toggleId); for (Iterator<String> iterator = expandedIds.iterator(); iterator.hasNext();) { String id = iterator.next(); if (id.startsWith(toggleId)) { iterator.remove(); } } } else { expandedIds.add(toggleId); } } sourceNode.setUserData(VPE_EXPANDED_TOGGLE_IDS, expandedIds, null); panelMenuParent.setUserData(VPE_EXPANDED_TOGGLE_IDS, expandedIds, null); builder.updateNode(panelMenuParent); } /* (non-Javadoc) * @see org.jboss.tools.vpe.editor.template.VpeToggableTemplate#stopToggling(org.w3c.dom.Node) */ public void stopToggling(Node sourceNode) { if (null != expandedIds) { expandedIds.clear(); } } /* (non-Javadoc) * @see org.jboss.tools.vpe.editor.template.VpeAbstractTemplate#isRecreateAtAttrChange(org.jboss.tools.vpe.editor.context.VpePageContext, org.w3c.dom.Element, org.mozilla.interfaces.nsIDOMDocument, org.mozilla.interfaces.nsIDOMElement, java.lang.Object, java.lang.String, java.lang.String) */ public boolean recreateAtAttrChange(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMElement visualNode, Object data, String name, String value) { return true; } /* (non-Javadoc) * @see org.jboss.tools.vpe.editor.template.VpeAbstractTemplate#setSourceAttributeSelection(org.jboss.tools.vpe.editor.context.VpePageContext, org.w3c.dom.Element, int, int, java.lang.Object) */ @Override public void setSourceAttributeSelection(VpePageContext pageContext, Element sourceElement, int offset, int length, Object data) { VpeSourceDomBuilder sourceBuilder = pageContext.getSourceBuilder(); sourceBuilder.setSelection(sourceElement, 0, 0); } class Attributes { /* * rich:panelMenu attributes for groups */ private String pm_iconGroupPosition; private String pm_iconGroupTopPosition; private String pm_iconCollapsedGroup; private String pm_iconCollapsedTopGroup; private String pm_iconExpandedGroup; private String pm_iconExpandedTopGroup; private String pm_iconDisabledGroup; private String pm_iconTopDisabledGroup; private String pm_expandSingle; /* * rich:panelMenu style classes for groups */ private String pm_disabled; private String pm_disabledGroupClass; private String pm_disabledGroupStyle; private String pm_topGroupClass; private String pm_topGroupStyle; private String pm_groupClass; private String pm_groupStyle; private String pm_style; private String pm_styleClass; /* * pich:panelMenuGroup attributes */ private String pmg_disabledStyle; private String pmg_disabledClass; private String pmg_disabled; private String pmg_iconClass; private String pmg_iconStyle; private String pmg_iconExpanded; private String pmg_iconCollapsed; private String pmg_iconDisabled; private String pmg_style; private String pmg_styleClass; public Attributes(final Element panelGroupElement, final Element panelMenuElement) { readPanelMenuGroupAttributes(panelGroupElement); readPanelMenuAttributes(panelMenuElement); } /** * Read attributes from the source element. * * @param sourceNode the source node */ private void readPanelMenuAttributes(Element sourceParentElement) { if (null == sourceParentElement) { return; } /* * rich:panelMenu attributes for groups */ pm_iconGroupPosition = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_GROUP_POSITION); pm_iconGroupTopPosition = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_GROUP_TOP_POSITION); pm_iconCollapsedGroup = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_COLLAPSED_GROUP); pm_iconCollapsedTopGroup = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_COLLAPSED_TOP_GROUP); pm_iconExpandedGroup = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_EXPANDED_GROUP); pm_iconExpandedTopGroup = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_EXPANDED_TOP_GROUP); pm_iconDisabledGroup = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_DISABLED_GROUP); pm_iconTopDisabledGroup = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_TOP_DISABLED_GROUP); pm_expandSingle = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.EXPAND_SINGLE); /* * rich:panelMenu style classes for groups */ pm_disabled = sourceParentElement.getAttribute(HTML.ATTR_DISABLED); pm_disabledGroupClass = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.DISABLED_GROUP_CLASS); pm_disabledGroupStyle = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.DISABLED_GROUP_STYLE); pm_topGroupClass = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.TOP_GROUP_CLASS); pm_topGroupStyle = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.TOP_GROUP_STYLE); pm_groupClass = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.GROUP_CLASS); pm_groupStyle = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.GROUP_STYLE); pm_style = sourceParentElement.getAttribute(RichFaces.ATTR_STYLE); pm_styleClass = sourceParentElement.getAttribute(RichFaces.ATTR_STYLE_CLASS); } /** * Read attributes from the source element. * * @param sourceNode the source node */ private void readPanelMenuGroupAttributes(Element sourceElement) { if (null == sourceElement) { return; } /* * pich:panelMenuGroup attributes */ pmg_disabledStyle = sourceElement.getAttribute(DISABLED_STYLE); pmg_disabledClass = sourceElement.getAttribute(DISABLED_CLASS); pmg_disabled = sourceElement.getAttribute(HTML.ATTR_DISABLED); pmg_iconClass = sourceElement.getAttribute(ICON_CLASS); pmg_iconStyle = sourceElement.getAttribute(ICON_STYLE); pmg_iconExpanded = sourceElement.getAttribute(ICON_EXPANDED); pmg_iconCollapsed = sourceElement.getAttribute(ICON_COLLAPSED); pmg_iconDisabled = sourceElement.getAttribute(ICON_DISABLED); pmg_style = sourceElement.getAttribute(STYLE); pmg_styleClass = sourceElement.getAttribute(STYLE_CLASS); } public String getPm_iconGroupPosition() { return pm_iconGroupPosition; } public String getPm_iconGroupTopPosition() { return pm_iconGroupTopPosition; } public String getPm_iconCollapsedGroup() { return pm_iconCollapsedGroup; } public String getPm_iconCollapsedTopGroup() { return pm_iconCollapsedTopGroup; } public String getPm_iconExpandedGroup() { return pm_iconExpandedGroup; } public String getPm_iconExpandedTopGroup() { return pm_iconExpandedTopGroup; } public String getPm_iconDisabledGroup() { return pm_iconDisabledGroup; } public String getPm_iconTopDisabledGroup() { return pm_iconTopDisabledGroup; } public String getPm_expandSingle() { return pm_expandSingle; } public String getPm_disabled() { return pm_disabled; } public String getPm_disabledGroupClass() { return pm_disabledGroupClass; } public String getPm_disabledGroupStyle() { return pm_disabledGroupStyle; } public String getPm_topGroupClass() { return pm_topGroupClass; } public String getPm_topGroupStyle() { return pm_topGroupStyle; } public String getPm_groupClass() { return pm_groupClass; } public String getPm_groupStyle() { return pm_groupStyle; } public String getPm_style() { return pm_style; } public String getPm_styleClass() { return pm_styleClass; } public String getPmg_disabledStyle() { return pmg_disabledStyle; } public String getPmg_disabledClass() { return pmg_disabledClass; } public String getPmg_disabled() { return pmg_disabled; } public String getPmg_iconClass() { return pmg_iconClass; } public String getPmg_iconStyle() { return pmg_iconStyle; } public String getPmg_iconExpanded() { return pmg_iconExpanded; } public String getPmg_iconCollapsed() { return pmg_iconCollapsed; } public String getPmg_iconDisabled() { return pmg_iconDisabled; } public String getPmg_style() { return pmg_style; } public String getPmg_styleClass() { return pmg_styleClass; } } }