| /******************************************************************************* |
| * Copyright (c) 2007 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| /** |
| * |
| */ |
| package org.eclipse.wst.jsdt.web.ui.views.provisional.contentoutline; |
| |
| import org.eclipse.wst.sse.core.utils.StringUtils; |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration; |
| import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery; |
| import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil; |
| import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.NamedNodeMap; |
| import org.w3c.dom.Node; |
| |
| /** |
| * |
| |
| * Provisional API: This class/interface is part of an interim API that is still under development and expected to |
| * change significantly before reaching stability. It is being made available at this early stage to solicit feedback |
| * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken |
| * (repeatedly) as the API evolves. |
| */ |
| public class XMLLabelProvider extends JFaceNodeLabelProvider { |
| boolean fShowAttributes = false; |
| |
| |
| public String getText(Object o) { |
| StringBuffer text = new StringBuffer(super.getText(o)); |
| if (o instanceof Node) { |
| Node node = (Node) o; |
| if ((node.getNodeType() == Node.ELEMENT_NODE) && fShowAttributes) { |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=88444 |
| if (node.hasAttributes()) { |
| Element element = (Element) node; |
| NamedNodeMap attributes = element.getAttributes(); |
| Node idTypedAttribute = null; |
| Node requiredAttribute = null; |
| boolean hasId = false; |
| boolean hasName = false; |
| Node shownAttribute = null; |
| // try to get content model element |
| // declaration |
| CMElementDeclaration elementDecl = null; |
| ModelQuery mq = ModelQueryUtil.getModelQuery(element.getOwnerDocument()); |
| if (mq != null) { |
| elementDecl = mq.getCMElementDeclaration(element); |
| } |
| // find an attribute of type (or just named) |
| // ID |
| if (elementDecl != null) { |
| int i = 0; |
| while ((i < attributes.getLength()) && (idTypedAttribute == null)) { |
| Node attr = attributes.item(i); |
| String attrName = attr.getNodeName(); |
| CMAttributeDeclaration attrDecl = (CMAttributeDeclaration) elementDecl.getAttributes().getNamedItem(attrName); |
| if (attrDecl != null) { |
| if ((attrDecl.getAttrType() != null) && (CMDataType.ID.equals(attrDecl.getAttrType().getDataTypeName()))) { |
| idTypedAttribute = attr; |
| } else if ((attrDecl.getUsage() == CMAttributeDeclaration.REQUIRED) && (requiredAttribute == null)) { |
| // as a backup, keep tabs on |
| // any required |
| // attributes |
| requiredAttribute = attr; |
| } else { |
| hasId = hasId || attrName.equals("id"); //$NON-NLS-1$ |
| hasName = hasName || attrName.equals("name"); //$NON-NLS-1$ |
| } |
| } |
| ++i; |
| } |
| } |
| /* |
| * If no suitable attribute was found, try using a |
| * required attribute, if none, then prefer "id" or |
| * "name", otherwise just use first attribute |
| */ |
| if (idTypedAttribute != null) { |
| shownAttribute = idTypedAttribute; |
| } else if (requiredAttribute != null) { |
| shownAttribute = requiredAttribute; |
| } else if (hasId) { |
| shownAttribute = attributes.getNamedItem("id"); //$NON-NLS-1$ |
| } else if (hasName) { |
| shownAttribute = attributes.getNamedItem("name"); //$NON-NLS-1$ |
| } |
| if (shownAttribute == null) { |
| shownAttribute = attributes.item(0); |
| } |
| // display the attribute and value (without quotes) |
| String attributeName = shownAttribute.getNodeName(); |
| if ((attributeName != null) && (attributeName.length() > 0)) { |
| text.append(" " + attributeName); //$NON-NLS-1$ |
| String attributeValue = shownAttribute.getNodeValue(); |
| if ((attributeValue != null) && (attributeValue.length() > 0)) { |
| text.append("=" + StringUtils.strip(attributeValue)); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| } |
| return text.toString(); |
| } |
| } |