/******************************************************************************* * 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 org.eclipse.swt.graphics.Point; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr; import org.jboss.tools.jsf.vpe.jsf.VpeElementProxyData; import org.jboss.tools.vpe.editor.context.VpePageContext; import org.jboss.tools.vpe.editor.mapping.AttributeData; import org.jboss.tools.vpe.editor.mapping.NodeData; import org.jboss.tools.vpe.editor.mapping.VpeDomMapping; import org.jboss.tools.vpe.editor.mapping.VpeElementData; import org.jboss.tools.vpe.editor.mapping.VpeElementMapping; import org.jboss.tools.vpe.editor.mapping.VpeNodeMapping; 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.mozilla.interfaces.nsIDOMDocument; import org.mozilla.interfaces.nsIDOMElement; import org.mozilla.interfaces.nsIDOMNode; import org.mozilla.interfaces.nsIDOMText; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public abstract class AbstractOutputJsfTemplate extends AbstractEditableJsfTemplate { /* * https://issues.jboss.org/browse/JBIDE-9417 * For some templates escape attribute name could differ, * so it was made editable. */ protected String escapeAttributeName = JSF.ATTR_ESCAPE; /** * copy outputAttributes * * @param visualElement * @param sourceElement */ protected void copyOutputJsfAttributes(nsIDOMElement visualElement, Element sourceElement) { copyGeneralJsfAttributes(sourceElement, visualElement); copyAttribute(visualElement, sourceElement, JSF.ATTR_DIR, HTML.ATTR_DIR); } protected void processOutputAttribute(VpePageContext pageContext, nsIDOMDocument visualDocument, Element sourceElement, nsIDOMElement targetVisualElement, VpeCreationData creationData) { VpeElementProxyData elementData = new VpeElementProxyData(); Attr outputAttr = getOutputAttributeNode(sourceElement); if (outputAttr != null) { String newValue = prepareAttrValue(pageContext, sourceElement, outputAttr); /* * if escape then contents of value (or other attribute) is only text */ if (!sourceElement.hasAttribute(escapeAttributeName) || "true".equalsIgnoreCase(sourceElement.getAttribute(escapeAttributeName))) { //$NON-NLS-1$ String value = outputAttr.getValue(); nsIDOMText text; // if bundleValue differ from value then will be represent // bundleValue, but text will be not edit boolean isEditable = value.equals(newValue); text = visualDocument.createTextNode(newValue); // add attribute for ability of editing elementData.addNodeData(new AttributeData(outputAttr, text, isEditable)); targetVisualElement.appendChild(text); } else { /* * then text can be html code * create VpeChildrenInfo to process source nodes */ VpeChildrenInfo targetVisualInfo = new VpeChildrenInfo(targetVisualElement); // get atribute's offset //mareshkau because it's node can be a proxy, see JBIDE-3144 if(!(outputAttr instanceof IDOMAttr)) { outputAttr = (Attr) ((((Attr)outputAttr).getOwnerElement()) .getAttributes().getNamedItem(outputAttr.getLocalName())); } int offset = ((IDOMAttr) outputAttr).getValueRegionStartOffset(); // reparse attribute's value NodeList list = NodeProxyUtil.reparseAttributeValue( elementData, newValue, offset + 1); // add children to info for (int i = 0; i < list.getLength(); i++) { Node child = list.item(i); // add info to creation data targetVisualInfo.addSourceChild(child); } elementData.addNodeData(new AttributeData(outputAttr, targetVisualElement, true)); creationData.addChildrenInfo(targetVisualInfo); } } creationData.setElementData(elementData); } @Override public void setPseudoContent(VpePageContext pageContext, Node sourceContainer, nsIDOMNode visualContainer, nsIDOMDocument visualDocument) { /* * Do nothing */ } @Override public NodeData getNodeData(nsIDOMNode node, VpeElementData elementData, VpeDomMapping domMapping) { NodeData nodeData = super.getNodeData(node, elementData, domMapping); if (nodeData == null) { VpeNodeMapping nodeMapping = domMapping.getNodeMapping(node); if (nodeMapping != null) { if (nodeMapping instanceof VpeElementMapping) { nodeData = super.getNodeData(node, ((VpeElementMapping) nodeMapping).getElementData(), domMapping); } // else if (nodeMapping.getType() == VpeNodeMapping.TEXT_MAPPING) { // nodeData = new NodeData(nodeMapping.getSourceNode(), node, // true); // } } } return nodeData; } @Override public nsIDOMNode getVisualNodeBySourcePosition( VpeElementMapping elementMapping, Point selectionRange, VpeDomMapping domMapping) { nsIDOMNode node = null; if ((elementMapping.getElementData() instanceof VpeElementProxyData) && (((VpeElementProxyData) elementMapping.getElementData()).getNodelist() != null)) { VpeElementProxyData elementProxyData = (VpeElementProxyData) elementMapping.getElementData(); VpeNodeMapping nodeMapping = NodeProxyUtil.findNodeByPosition( domMapping, elementProxyData.getNodelist(), selectionRange); if (nodeMapping != null) { if (nodeMapping instanceof VpeElementMapping) { node = super.getVisualNodeBySourcePosition( (VpeElementMapping) nodeMapping, selectionRange, domMapping); } else { node = nodeMapping.getVisualNode(); } } } if (node == null) { node = super.getVisualNodeBySourcePosition(elementMapping, selectionRange, domMapping); } return node; } protected String prepareAttrValue(VpePageContext pageContext, Element parent, Attr attr) { /* * Currently used only in JsfOutputFormatTemplate */ return attr.getNodeValue(); } /** * If tag uses different attribute name than "escape" for displaying escaped sequence -- * subclasses could set an appropriate attribute name directly * * @param escapeAttributeName the new attribute name */ protected void setEscapeAttributeName(String escapeAttributeName) { this.escapeAttributeName = escapeAttributeName; } }