/******************************************************************************* * 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.jsf.template; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Region; import org.eclipse.wst.xml.core.internal.document.AttrImpl; import org.jboss.tools.vpe.editor.context.VpePageContext; import org.jboss.tools.vpe.editor.template.VpeAbstractTemplate; import org.jboss.tools.vpe.editor.util.HTML; import org.jboss.tools.vpe.editor.util.TextUtil; import org.mozilla.interfaces.nsIDOMElement; import org.mozilla.interfaces.nsIDOMNode; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.Text; /** * general class for jsf templates. * * @author Sergey Dzmitrovich */ public abstract class AbstractEditableJsfTemplate extends VpeAbstractTemplate { // general jsf attributes /** * Contains JSF attributes and appropriate HTML attributes * content of that does not have to be modified in templates. */ static final private Map<String, String> attributes = new HashMap<String, String>(); static { attributes.put(JSF.ATTR_STYLE, HTML.ATTR_STYLE); attributes.put(JSF.ATTR_STYLE_CLASS, HTML.ATTR_CLASS); } /** * Renames and copies most general JSF attributes from the * {@code sourceElement} to the {@code visualElement}. * * @param sourceElement the source element * @param visualElement the visual element * @see AbstractEditableJsfTemplate#attributes attributes */ protected void copyGeneralJsfAttributes(Element sourceElement, nsIDOMElement visualElement) { Set<Map.Entry<String, String>> jsfAttrEntries = attributes.entrySet(); for (Map.Entry<String, String> attrEntry : jsfAttrEntries) { copyAttribute(visualElement, sourceElement, attrEntry.getKey(), attrEntry.getValue()); } } /** * copy attribute. * * @param sourceElement the source element * @param targetAtttributeName the target atttribute name * @param sourceAttributeName the source attribute name * @param visualElement the visual element */ protected void copyAttribute(nsIDOMElement visualElement, Element sourceElement, String sourceAttributeName, String targetAtttributeName) { if (sourceElement.hasAttribute(sourceAttributeName)) visualElement.setAttribute(targetAtttributeName, sourceElement .getAttribute(sourceAttributeName)); } @Override public IRegion getSourceRegionForOpenOn(VpePageContext pageContext, Node sourceNode ,nsIDOMNode domNode) { final Attr attr= getOutputAttributeNode((Element) sourceNode); int offset = TextUtil.getPositionForOpenOn(attr, pageContext); if(offset!=-1){ return new Region(offset, 0); } else { return super.getSourceRegionForOpenOn(pageContext, sourceNode, domNode); } } /** * Gets the output attribute node. * This method may be overridden in subclasses. * * @param element the element * * @return the output attribute node */ public Attr getOutputAttributeNode(Element element) { if (element.hasAttribute(JSF.ATTR_VALUE)) { return element.getAttributeNode(JSF.ATTR_VALUE); } else if (element.hasAttribute(JSF.ATTR_BINDING)) { return element.getAttributeNode(JSF.ATTR_BINDING); } return null; } }