/******************************************************************************* * 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.List; import org.jboss.tools.jsf.vpe.richfaces.ComponentUtil; import org.jboss.tools.vpe.editor.VpeSourceDomBuilder; 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.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 RichFacesPanelMenuItemTemplate extends VpeAbstractTemplate { public static final String VPE_PANEL_MENU_ITEM_ID = "vpe-panel-menu-item-id"; //$NON-NLS-1$ /* * rich:panelMenuItem attributes */ private static final String DISABLED = "disabled"; //$NON-NLS-1$ private static final String LABEL = "label"; //$NON-NLS-1$ private static final String ICON = "icon"; //$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_DISABLED = "iconDisabled"; //$NON-NLS-1$ private static final String DISABLED_CLASS = "disabledClass"; //$NON-NLS-1$ private static final String DISABLED_STYLE = "disabledStyle"; //$NON-NLS-1$ private static final String STYLE = "style"; //$NON-NLS-1$ private static final String STYLE_CLASS = "styleClass"; //$NON-NLS-1$ /* * rich:panelMenuItem css styles */ public static final String CSS_TOP_ITEM = "rich-pmenu-top-item"; //$NON-NLS-1$ public static final String CSS_TOP_ITEM_ICON = "rich-pmenu-top-item-icon"; //$NON-NLS-1$ public static final String CSS_TOP_ITEM_LABEL = "rich-pmenu-top-item-label"; //$NON-NLS-1$ public static final String CSS_ITEM = "rich-pmenu-item"; //$NON-NLS-1$ public static final String CSS_ITEM_ICON = "rich-pmenu-item-icon"; //$NON-NLS-1$ public static final String CSS_ITEM_LABEL = "rich-pmenu-item-label"; //$NON-NLS-1$ public static final String CSS_ITEM_SELECTED = "rich-pmenu-item-selected"; //$NON-NLS-1$ public static final String CSS_HOVERED_ELEMENT = "rich-pmenu-hovered-element"; //$NON-NLS-1$ public static final String CSS_DISABLED_ELEMENT = "rich-pmenu-disabled-element"; //$NON-NLS-1$ /* * rich:panelMenuItem default css styles */ private static final String DR_NOWARP_CLASS = "dr-pmenu-nowrap"; //$NON-NLS-1$ private static final String DR_TOP_DIV = "dr-pmenu-top-self-div"; //$NON-NLS-1$ private static final String IMG_POINTS_SRC = "/panelMenuItem/points.gif"; //$NON-NLS-1$ private static final String IMG_SPACER_SRC = "/panelMenuItem/spacer.gif"; //$NON-NLS-1$ private static final String STYLE_PATH = "/panelMenuItem/style.css"; //$NON-NLS-1$ private static final String SPACE = " "; //$NON-NLS-1$ private static final String EMPTY = ""; //$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 = "left"; //$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 NO_SIZE_VALUE = "0"; //$NON-NLS-1$ private static final String DEFAULT_SIZE_VALUE = "16"; //$NON-NLS-1$ private static final String COMPONENT_NAME = "panelMenuItem"; //$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 MARGIN_TOP = "margin-top: 3px; "; //$NON-NLS-1$ private static final String WIDTH_100_PERCENTS = "width: 100%; "; //$NON-NLS-1$ /* * rich:panelMenu attributes for items */ private static String pm_disabled; private static String pm_iconItem; private static String pm_iconDisabledItem; private static String pm_iconItemPosition; private static String pm_iconTopItem; private static String pm_iconTopDisabledItem; private static String pm_iconItemTopPosition; /* * rich:panelMenu style classes for items */ private static String pm_disabledItemClass; private static String pm_disabledItemStyle; private static String pm_topItemClass; private static String pm_topItemStyle; private static String pm_itemClass; private static String pm_itemStyle; /* * rich:panelMenuItem attributes */ private static String pmi_disabled; private static String pmi_icon; private static String pmi_iconClass; private static String pmi_iconStyle; private static String pmi_iconDisabled; private static String pmi_disabledClass; private static String pmi_disabledStyle; private static String pmi_style; private static String pmi_styleClass; public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { nsIDOMElement creationDataDiv = visualDocument .createElement(HTML.TAG_DIV); VpeCreationData creationData = new VpeCreationData(creationDataDiv); Element itemSourceElement = (Element) sourceNode; Element srcElement = null; //added by estherbin fixed https://jira.jboss.org/jira/browse/JBIDE-1605 // if ((itemSourceElement.getUserData(VpeVisualDomBuilder.SRC_NODE) != null) // && (itemSourceElement.getUserData(VpeVisualDomBuilder.SRC_NODE) instanceof Element)) { // srcElement = (Element) itemSourceElement.getUserData(VpeVisualDomBuilder.SRC_NODE); // } ComponentUtil.setCSSLink(pageContext, STYLE_PATH, COMPONENT_NAME); //added by estherbin fixed https://jira.jboss.org/jira/browse/JBIDE-1605 final Element elementToPass = ((srcElement != null) ? srcElement : itemSourceElement); Element anySuitableParent = getItemParent(elementToPass, false); Element panelMenuParent = getItemParent(elementToPass, true); String childId = (String) elementToPass.getUserData(VPE_PANEL_MENU_ITEM_ID); //fix for JBIDE-3737 if(childId==null) { childId = "";//$NON-NLS-1$ } readPanelMenuAttributes(panelMenuParent); readPanelMenuItemAttributes(itemSourceElement); creationDataDiv.setAttribute(HTML.ATTR_CLASS, DR_TOP_DIV); creationDataDiv.setAttribute(HTML.ATTR_BORDER, "0"); //$NON-NLS-1$ creationDataDiv.setAttribute(HTML.ATTR_STYLE, MARGIN_TOP); boolean childOfPanelMenu = anySuitableParent != null ? anySuitableParent .getNodeName().endsWith(PANEL_MENU_END_TAG) : false; boolean childOfPanelMenuGroup = anySuitableParent != null ? anySuitableParent .getNodeName().endsWith(PANEL_MENU_GROUP_END_TAG) : false; if (childOfPanelMenu || childOfPanelMenuGroup) { creationDataDiv.setAttribute("vpeSupport", COMPONENT_NAME); //$NON-NLS-1$ nsIDOMElement table = visualDocument .createElement(HTML.TAG_TABLE); creationDataDiv.appendChild(table); table.setAttribute(HTML.ATTR_CELLPADDING, NO_SIZE_VALUE); table.setAttribute(HTML.ATTR_CELLSPACING, NO_SIZE_VALUE); table.setAttribute(HTML.ATTR_BORDER, NO_SIZE_VALUE); nsIDOMElement tr = visualDocument .createElement(HTML.TAG_TR); table.appendChild(tr); /* * Add indentation for nested items */ String[] ids = childId.split(RichFacesPanelMenuGroupTemplate.GROUP_COUNT_SEPARATOR); if (ids.length > 0) { for (int i = 1; i <= ids.length; i++) { /* * Skip indentation in top menu items */ if (EMPTY.equalsIgnoreCase(ids[0])) { continue; } nsIDOMElement spacerTd = visualDocument .createElement(HTML.TAG_TD); nsIDOMElement spacerImg = visualDocument .createElement(HTML.TAG_IMG); spacerTd.appendChild(spacerImg); ComponentUtil.setImg(spacerImg, IMG_SPACER_SRC); setDefaultImgAttributes(spacerImg); spacerTd.setAttribute(HTML.ATTR_HEIGHT, DEFAULT_SIZE_VALUE); spacerTd.setAttribute(HTML.ATTR_WIDTH, DEFAULT_SIZE_VALUE); tr.appendChild(spacerTd); } } nsIDOMElement tdNowrapLeft = visualDocument .createElement(HTML.TAG_TD); tr.appendChild(tdNowrapLeft); nsIDOMElement tdLabel = visualDocument .createElement(HTML.TAG_TD); tr.appendChild(tdLabel); /* * Item label routine. */ Attr labelAttr = null; String labelValue = EMPTY; String bundleValue = EMPTY; String resultValue = EMPTY; if (itemSourceElement.hasAttribute(LABEL)) { labelAttr = itemSourceElement.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 = EMPTY; } } nsIDOMText text = visualDocument.createTextNode(resultValue); tdLabel.appendChild(text); nsIDOMElement tdRight = visualDocument .createElement(HTML.TAG_TD); tr.appendChild(tdRight); nsIDOMElement imgIcon = visualDocument .createElement(HTML.TAG_IMG); setDefaultImgAttributes(imgIcon); setIcon(childOfPanelMenu, pageContext, imgIcon); nsIDOMElement imgSpacer1 = visualDocument .createElement(HTML.TAG_IMG); setDefaultImgAttributes(imgSpacer1); ComponentUtil.setImg(imgSpacer1, IMG_SPACER_SRC); tdNowrapLeft.appendChild(imgSpacer1); nsIDOMElement imgSpacer = visualDocument .createElement(HTML.TAG_IMG); setDefaultImgAttributes(imgSpacer); ComponentUtil.setImg(imgSpacer, IMG_SPACER_SRC); nsIDOMElement iconCell = tdNowrapLeft; nsIDOMElement emptyCell = tdRight; if (!childOfPanelMenu && ComponentUtil.isNotBlank(pm_iconItemPosition)) { if (RIGHT.equalsIgnoreCase(pm_iconItemPosition)) { /* * Set icon image on the right */ iconCell = tdRight; emptyCell = tdNowrapLeft; } } if (childOfPanelMenu && ComponentUtil.isNotBlank(pm_iconItemTopPosition)) { if (RIGHT.equalsIgnoreCase(pm_iconItemTopPosition)) { /* * Set icon image on the right */ iconCell = tdRight; emptyCell = tdNowrapLeft; } else if (LEFT.equalsIgnoreCase(pm_iconItemTopPosition)) { iconCell = tdNowrapLeft; emptyCell = tdRight; } } iconCell.appendChild(imgIcon); emptyCell.appendChild(imgSpacer); setItemClassAndStyle(childOfPanelMenu, table, tr, iconCell, imgIcon, tdLabel, emptyCell); List<Node> children = ComponentUtil.getChildren(itemSourceElement); nsIDOMElement childSpan = visualDocument .createElement(HTML.TAG_SPAN); VpeChildrenInfo childrenInfo = new VpeChildrenInfo(childSpan); if (!children.isEmpty()) { childrenInfo = new VpeChildrenInfo(tdLabel); creationData.addChildrenInfo(childrenInfo); for (Node child : children) { if (!(child.getNodeName().endsWith(PANEL_MENU_GROUP_END_TAG) || child .getNodeName().endsWith(PANEL_MENU_END_TAG))) { childrenInfo.addSourceChild(child); } } } if (childrenInfo.getSourceChildren() == null) { creationData.addChildrenInfo(childrenInfo); } } return creationData; } public boolean recreateAtAttrChange(VpePageContext pageContext, Element sourceElement, nsIDOMDocument visualDocument, nsIDOMElement visualNode, Object data, String name, String value) { return true; } private static void setDefaultImgAttributes(nsIDOMElement element) { element.setAttribute(VSPACE, NO_SIZE_VALUE); element.setAttribute(HSPACE, NO_SIZE_VALUE); element.setAttribute(HTML.ATTR_HEIGHT, DEFAULT_SIZE_VALUE); element.setAttribute(HTML.ATTR_WIDTH, DEFAULT_SIZE_VALUE); } /** * Gets the specified icon from panelMenu or panelMenuGroupItem * * @param pm_icon the panelMenu icon attribute * @param pmi_icon the panelMenuGroupItem icon attribute * * @return the specified icon */ private static String[] getSpecifiedIcon(String pm_icon, String pmi_icon) { String[] imgPath = {EMPTY, EMPTY}; if (ComponentUtil.isNotBlank(pmi_icon)) { /* * Icon was set in the panelMenuItem attribute. */ imgPath[0] = pmi_icon; if (RichFacesPanelMenuGroupTemplate.DEFAULT_ICON_MAP.containsKey(pmi_icon)) { imgPath[1] = RichFacesPanelMenuGroupTemplate.DEFAULT_ICON_MAP.get(pmi_icon); } } else if (ComponentUtil.isNotBlank(pm_icon)) { /* * Icon was set in the panelMenu attribute. */ imgPath[0] = pm_icon; if (RichFacesPanelMenuGroupTemplate.DEFAULT_ICON_MAP.containsKey(pm_icon)) { imgPath[1] = RichFacesPanelMenuGroupTemplate.DEFAULT_ICON_MAP.get(pm_icon); } } return imgPath; } /** * Sets the src attribute value for the image * * @param childOfPanelMenu if the item is the child of panelMenu * @param pageContext the page context * @param img the image */ private static void setIcon(boolean childOfPanelMenu, VpePageContext pageContext, nsIDOMElement img) { /* * The first array element contains specified icon path or default icon name. * The second array element contains default icon path. */ String[] imgPath = {EMPTY, EMPTY}; if (childOfPanelMenu) { if (TRUE.equalsIgnoreCase(pmi_disabled)) { imgPath = getSpecifiedIcon(pm_iconTopDisabledItem, pmi_iconDisabled); } else { imgPath = getSpecifiedIcon(pm_iconTopItem, pmi_icon); } } else { if (TRUE.equalsIgnoreCase(pmi_disabled)) { imgPath = getSpecifiedIcon(pm_iconDisabledItem, pmi_iconDisabled); } else { imgPath = getSpecifiedIcon(pm_iconItem, pmi_icon); } } if (EMPTY.equalsIgnoreCase(imgPath[0])) { /* * Icon wasn't set. Use default image. */ ComponentUtil.setImg(img, IMG_POINTS_SRC); } else { /* * Set specified icon. */ if (RichFacesPanelMenuGroupTemplate.DEFAULT_ICON_MAP.containsKey(imgPath[0])) { ComponentUtil.setImg(img, imgPath[1]); } else { String imgFullPath = VpeStyleUtil.addFullPathToImgSrc(imgPath[0], pageContext, true); img.setAttribute(HTML.ATTR_SRC, imgFullPath); } } } /** * Sets the item class and style for the item. * * @param childOfPanelMenu if the item is the child of panelMenu * @param table the table * @param tr the table row * @param iconCell the first table row column image * @param labelCell the second table row column * @param emptyCell the third table row column image */ private static void setItemClassAndStyle(boolean childOfPanelMenu, nsIDOMElement table, nsIDOMElement tr, nsIDOMElement iconCell, nsIDOMElement imgIcon, nsIDOMElement labelCell, nsIDOMElement emptyCell) { String tableStyle = MARGIN_TOP; String iconCellStyle = EMPTY; String labelCellStyle = WIDTH_100_PERCENTS; String emptyCellStyle = EMPTY; String tableClass = EMPTY; String trClass = EMPTY; String iconCellClass = EMPTY; String imgIconClass = EMPTY; String labelCellClass = EMPTY; String emptyCellClass = EMPTY; if (ComponentUtil.isNotBlank(pmi_styleClass)) { tableClass += SPACE + pmi_styleClass; } if (ComponentUtil.isNotBlank(pmi_style)) { tableStyle += SPACE + pmi_style; } tableClass += SPACE + CSS_ITEM; if (TRUE.equalsIgnoreCase(pm_disabled)) { if (childOfPanelMenu) { tableClass += SPACE + CSS_TOP_ITEM; iconCellClass += SPACE + CSS_TOP_ITEM_ICON; labelCellClass += SPACE + CSS_TOP_ITEM_LABEL; if (ComponentUtil.isNotBlank(pm_disabledItemClass)) { tableClass += SPACE + pm_disabledItemClass; } if (ComponentUtil.isNotBlank(pm_topItemStyle)) { tableStyle += SPACE + pm_topItemStyle; } } } if (TRUE.equalsIgnoreCase(pmi_disabled)) { // tableClass += SPACE + CSS_DISABLED_ELEMENT; if ((ComponentUtil.isNotBlank(pm_disabledItemClass)) && !(TRUE.equalsIgnoreCase(pm_disabled))) { tableClass += SPACE + pm_disabledItemClass; } if (ComponentUtil.isNotBlank(pm_disabledItemStyle)) { tableStyle += SPACE + pm_disabledItemStyle; } if (ComponentUtil.isNotBlank(pmi_disabledClass)) { tableClass += SPACE + pmi_disabledClass; } if (ComponentUtil.isNotBlank(pmi_disabledStyle)) { tableStyle += SPACE + pmi_disabledStyle; } } if (!(TRUE.equalsIgnoreCase(pm_disabled)) && (!(TRUE.equalsIgnoreCase(pmi_disabled)))) { // iconCellClass = DR_NOWARP_CLASS + SPACE + CSS_ITEM_ICON; iconCellClass = DR_NOWARP_CLASS; imgIconClass = CSS_ITEM_ICON; labelCellClass = CSS_ITEM_LABEL; emptyCellClass = DR_NOWARP_CLASS; if (ComponentUtil.isNotBlank(pmi_iconClass)) { imgIconClass += SPACE + pmi_iconClass; } if (ComponentUtil.isNotBlank(pmi_iconStyle)) { iconCellStyle += SPACE + pmi_iconStyle; } if (childOfPanelMenu) { tableClass += SPACE + CSS_TOP_ITEM; imgIconClass += SPACE + CSS_TOP_ITEM_ICON; labelCellClass += SPACE + CSS_TOP_ITEM_LABEL; if (ComponentUtil.isNotBlank(pm_topItemClass)) { tableClass += SPACE + pm_topItemClass; } if (ComponentUtil.isNotBlank(pm_topItemStyle)) { tableStyle += SPACE + pm_topItemStyle; } } else { if (ComponentUtil.isNotBlank(pm_itemClass)) { tableClass += SPACE + pm_itemClass; } if (ComponentUtil.isNotBlank(pm_itemStyle)) { tableStyle += SPACE + pm_itemStyle; } } } table.setAttribute(HTML.ATTR_STYLE, tableStyle); iconCell.setAttribute(HTML.ATTR_STYLE, iconCellStyle); labelCell.setAttribute(HTML.ATTR_STYLE, labelCellStyle); emptyCell.setAttribute(HTML.ATTR_STYLE, emptyCellStyle); table.setAttribute(HTML.ATTR_CLASS, tableClass); tr.setAttribute(HTML.ATTR_CLASS, trClass); iconCell.setAttribute(HTML.ATTR_CLASS, iconCellClass); imgIcon.setAttribute(HTML.ATTR_CLASS, imgIconClass); labelCell.setAttribute(HTML.ATTR_CLASS, labelCellClass); emptyCell.setAttribute(HTML.ATTR_CLASS, emptyCellClass); } /** * Gets the panel menu item parent. * * @param sourceItemElement the source item element * @param findOnlyPanelMenuParent flag to find only panel menu parent * * @return the item parent, can return null */ private static final Element getItemParent(Element sourceItemElement, boolean findOnlyPanelMenuParent) { Element parent = null; Element currentElement = sourceItemElement; while ((currentElement.getParentNode() != null) && (currentElement.getParentNode().getNodeType() == Node.ELEMENT_NODE)) { currentElement = parent = (Element) currentElement.getParentNode(); if (findOnlyPanelMenuParent) { if (parent.getNodeName().endsWith(PANEL_MENU_END_TAG)) { break; } } else { if (parent.getNodeName().endsWith(PANEL_MENU_END_TAG) || parent.getNodeName().endsWith( PANEL_MENU_GROUP_END_TAG)) { break; } } } return parent; } /** * Read attributes from the source element. * * @param sourceNode the source node */ private static void readPanelMenuAttributes(Element sourceParentElement) { if (null == sourceParentElement) { return; } /* * rich:panelMenu attributes for items */ pm_disabled = sourceParentElement.getAttribute(HTML.ATTR_DISABLED); pm_iconItem = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_ITEM); pm_iconDisabledItem = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_DISABLED_ITEM); pm_iconItemPosition = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_ITEM_POSITION); pm_iconTopItem = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_TOP_ITEM); pm_iconTopDisabledItem = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_TOP_DISABLED_ITEM); pm_iconItemTopPosition = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ICON_ITEM_TOP_POSITION); /* * rich:panelMenu style classes for items */ pm_disabledItemClass = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.DISABLED_ITEM_CLASS); pm_disabledItemStyle = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.DISABLED_ITEM_STYLE); pm_topItemClass = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.TOP_ITEM_CLASS); pm_topItemStyle = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.TOP_ITEM_STYLE); pm_itemClass = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ITEM_CLASS); pm_itemStyle = sourceParentElement.getAttribute(RichFacesPanelMenuTemplate.ITEM_STYLE); } /** * Read attributes from the source element. * * @param sourceNode the source node */ private static void readPanelMenuItemAttributes(Element sourceElement) { if (null == sourceElement) { return; } /* * rich:panelMenuItem attributes */ pmi_disabled = sourceElement.getAttribute(DISABLED); pmi_icon = sourceElement.getAttribute(ICON); pmi_iconClass = sourceElement.getAttribute(ICON_CLASS); pmi_iconStyle = sourceElement.getAttribute(ICON_STYLE); pmi_iconDisabled = sourceElement.getAttribute(ICON_DISABLED); pmi_disabledClass = sourceElement.getAttribute(DISABLED_CLASS); pmi_disabledStyle = sourceElement.getAttribute(DISABLED_STYLE); pmi_style = sourceElement.getAttribute(STYLE); pmi_styleClass = sourceElement.getAttribute(STYLE_CLASS); } /* (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); } }