/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.vpe.template; import java.io.StringReader; import org.jboss.tools.seam.vpe.SeamTemplatesActivator; import org.jboss.tools.seam.vpe.text.xpl.SeamTextLexer; import org.jboss.tools.seam.vpe.text.xpl.SeamTextParser; import org.jboss.tools.vpe.editor.context.VpePageContext; import org.jboss.tools.vpe.editor.template.VpeAbstractTemplate; import org.jboss.tools.vpe.editor.template.VpeCreationData; import org.jboss.tools.vpe.editor.util.HTML; import org.jboss.tools.vpe.editor.util.VisualDomUtil; import org.mozilla.interfaces.nsIComponentManager; import org.mozilla.interfaces.nsIDOMDocument; import org.mozilla.interfaces.nsIDOMNode; import org.mozilla.interfaces.nsIDOMNodeList; import org.mozilla.interfaces.nsIDOMParser; import org.mozilla.xpcom.Mozilla; import org.w3c.dom.Element; import org.w3c.dom.Node; import antlr.RecognitionException; import antlr.TokenStreamException; /** * @author Vitali (vyemialyanchyk@exadel.com) * * s:formattedText template */ public class SeamFormattedTextTemplate extends VpeAbstractTemplate { private static final String CID_DOMPARSER = "@mozilla.org/xmlextras/domparser;1"; //$NON-NLS-1$ /** * component manager */ private nsIComponentManager componentManager; /** * Creates a node of the visual tree on the node of the source tree. This * visual node should not have the parent node This visual node can have * child nodes. * * @param pageContext * Contains the information on edited page. * @param sourceNode * The current node of the source tree. * @param visualDocument * The document of the visual tree. * @return The information on the created node of the visual tree. */ public VpeCreationData create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument) { Element sourceElement = (Element) sourceNode; /* * Fixes https://jira.jboss.org/jira/browse/JBIDE-4104 * When there is no value attribute string reader * will be created with empty value. */ String valueT = ""; //$NON-NLS-1$ if (sourceElement.hasAttribute(HTML.ATTR_VALUE)) { valueT = sourceElement.getAttribute(HTML.ATTR_VALUE); } StringReader r = new StringReader(valueT); SeamTextLexer lexer = new SeamTextLexer(r); SeamTextParser parser = new SeamTextParser(lexer); try { parser.startRule(); } catch (RecognitionException e) { SeamTemplatesActivator.getPluginLog().logError(e); } catch (TokenStreamException e) { SeamTemplatesActivator.getPluginLog().logError(e); } nsIDOMParser parserDom = (nsIDOMParser) getComponentManager() .createInstanceByContractID(CID_DOMPARSER, null, nsIDOMParser.NS_IDOMPARSER_IID); String strDoc = "<HTML><BODY>" + parser.toString() + "</BODY></HTML>"; //$NON-NLS-1$ //$NON-NLS-2$ nsIDOMDocument domDoc = parserDom.parseFromString(strDoc, "application/xhtml+xml"); //$NON-NLS-1$ nsIDOMNode patronItem = null, nodeTmp = null; nsIDOMNodeList list = null; if (null != domDoc.getDocumentElement()) { list = domDoc.getDocumentElement().getChildNodes(); long i = 0; for (; i < list.getLength(); i++) { nodeTmp = list.item(i); if (HTML.TAG_BODY.equalsIgnoreCase(nodeTmp.getNodeName())) { patronItem = nodeTmp.cloneNode(true); break; } } } if (null != patronItem) { list = patronItem.getChildNodes(); // mainItem = visualDocument.createElement("DIV"); patronItem = VisualDomUtil.createBorderlessContainer(visualDocument); createCopyChildren(visualDocument, patronItem, list); } VpeCreationData creationData = new VpeCreationData(patronItem); return creationData; } public void createCopyChildren(nsIDOMDocument visualDocument, nsIDOMNode nodeParent, nsIDOMNodeList listCopyChildren) { long i = 0; nsIDOMNode nodeTmp = null, nodeTmp2 = null; for (; i < listCopyChildren.getLength(); i++) { nodeTmp = listCopyChildren.item(i); // remark: cloneNode true/false - is not suitable function here //nodeTmp2 = nodeTmp.cloneNode(false); if (nodeTmp.getNodeName().startsWith("#text")) { //$NON-NLS-1$ nodeTmp2 = visualDocument.createTextNode(nodeTmp.getNodeValue()); } else { if (!nodeTmp.getNodeName().startsWith("#")) { //$NON-NLS-1$ nodeTmp2 = visualDocument.createElement(nodeTmp.getNodeName()); } } if (null == nodeTmp2) { continue; } nodeParent.appendChild(nodeTmp2); createCopyChildren(visualDocument, nodeTmp2, nodeTmp.getChildNodes()); nodeTmp2 = null; } } public nsIComponentManager getComponentManager() { if (null == componentManager) { componentManager = Mozilla.getInstance().getComponentManager(); } return componentManager; } } // html code