/******************************************************************************* * Copyright (c) 2006 Sybase, Inc. and others. * * All rights reserved. This program and the accompanying materials * are 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: * Sybase, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.jst.pagedesigner.converter; import java.util.Set; import org.eclipse.jst.pagedesigner.IHTMLConstants; import org.eclipse.jst.pagedesigner.PDPlugin; import org.eclipse.jst.pagedesigner.dtmanager.DTManager; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @author mengbo * @version 1.5 */ public class ConverterUtil { /** * * @param source * @param dest * @param ignore */ public static void copyAllAttributes(Element source, Element dest, Set ignore) { NamedNodeMap attrs = source.getAttributes(); for (int i = 0, size = attrs.getLength(); i < size; i++) { Attr attr = (Attr) attrs.item(i); if (ignore == null || !ignore.contains(attr.getName())) { dest.setAttribute(attr.getName(), attr.getValue()); } } } /** * copy a single attribute (if exist) * * @param source * @param srcattr * @param dest * @param destattr */ public static void copyAttribute(Element source, String srcattr, Element dest, String destattr) { Attr attr = source.getAttributeNode(srcattr); if (attr != null) { dest.setAttribute(destattr, attr.getValue()); } } /** * @param hostElement * @return true if hostElement represents an empty container */ public static boolean isEmptyContainer(Element hostElement) { String hostElementString = hostElement.toString(); if (hostElementString != null && hostElementString.startsWith("/")) { //$NON-NLS-1$ return false; } NodeList nl = hostElement.getChildNodes(); if (nl == null || nl.getLength() == 0) { return true; } for (int i = 0, n = nl.getLength(); i < n; i++) { Node node = nl.item(i); if (!(node instanceof IDOMText)) { return false; } if (!((IDOMText) node).isElementContentWhitespace()) { return false; } } return true; } /** * @param document * @param text * @return the description element in the document containing text */ public static Element createDescriptionElement(IDOMDocument document, String text) { if (document == null) { return null; } Element span = document.createElement(IHTMLConstants.TAG_SPAN); span.setAttribute( "style", "color:gray;font-style:italic;font-size:normal;"); //$NON-NLS-1$ //$NON-NLS-2$ if (text == null) { span.appendChild(document.createTextNode(PDPlugin .getResourceString("ConverterUtil.Description"))); //$NON-NLS-1$ } else { span.appendChild(document.createTextNode(text)); } return span; } /** * Method to find the resulting converted tag containing a given * source element. The converted element that will be * the parent tag is returned so the caller can then determine * if the parent is part of a table, header, body, footer, row, * cell, or some other element. * * @param srcElem the source element to test. * @param childElem a child of the source element (used by a * recursive call to handle special case where * it was moved up a level to the child model * list of the grandparent). * @return a converted element of the type that will contain the * source element. */ static Node findConvertedParentElement(Element srcElem, Element childElem) { Node parent = srcElem.getParentNode(); if ((parent == null) || !(parent instanceof Element)) { return null; } String name = parent.getNodeName(); if (IHTMLConstants.TAG_HTML.equalsIgnoreCase(name) || IHTMLConstants.TAG_BODY.equalsIgnoreCase(name)) { return null; } ITagConverter converter = createTagConverter((Element) parent); if (!converter.isVisualByHTML()) { return null; } converter.convertRefresh(null); ConvertPosition position = null; if (childElem != null) { // If a child node (grand child of current parent) was // passed in, check for its position. It may have been // moved up a level to child model list of the current // parent. In JSF this is done with a header or // footer facet tag in a column tag for a dataTable. position = converter.getChildVisualPosition(childElem); } if (position == null) { position = converter.getChildVisualPosition(srcElem); } if (position != null) { // return the node that will contain the visual // child and then the caller can check to see if this // element is table mark-up. return position.getParentNode(); } // The current source element is not in the child model // list for the converted parent so recurse to next // ancestor and pass source element to see if it has been // moved up a level as child model of the grandparent. return findConvertedParentElement((Element) parent, srcElem); } private static ITagConverter createTagConverter(Element ele) { return DTManager.getInstance().getTagConverter(ele, IConverterFactory.MODE_DESIGNER, null); } }