/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Eclipse Public License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.eclipse.org/org/documents/epl-v10.php * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.ide.eclipse.adt.internal.editors; import static com.android.SdkConstants.ANDROID_URI; import static com.android.SdkConstants.ATTR_ID; import static com.android.SdkConstants.ATTR_LAYOUT; import static com.android.SdkConstants.ATTR_NAME; import static com.android.SdkConstants.ATTR_SRC; import static com.android.SdkConstants.ATTR_TEXT; import static com.android.SdkConstants.DRAWABLE_PREFIX; import static com.android.SdkConstants.LAYOUT_RESOURCE_PREFIX; import org.eclipse.swt.graphics.Image; import org.eclipse.wst.xml.ui.internal.contentoutline.JFaceNodeLabelProvider; import org.w3c.dom.DOMException; import org.w3c.dom.Element; /** * Label provider for the XML outlines and quick outlines: Use our own icons, * when available, and and include the most important attribute (id, name, or * text) */ @SuppressWarnings("restriction") // XML UI API class OutlineLabelProvider extends JFaceNodeLabelProvider { @Override public Image getImage(Object element) { if (element instanceof Element) { Element e = (Element) element; String tagName = e.getTagName(); IconFactory factory = IconFactory.getInstance(); Image img = factory.getIcon(tagName, null); if (img != null) { return img; } } return super.getImage(element); } @Override public String getText(Object element) { String text = super.getText(element); if (element instanceof Element) { Element e = (Element) element; String id = getAttributeNS(e, ANDROID_URI, ATTR_ID); if (id == null || id.length() == 0) { id = getAttributeNS(e, ANDROID_URI, ATTR_NAME); if (id == null || id.length() == 0) { id = e.getAttribute(ATTR_NAME); if (id == null || id.length() == 0) { id = getAttributeNS(e, ANDROID_URI, ATTR_TEXT); if (id != null && id.length() > 15) { id = id.substring(0, 12) + "..."; } if (id == null || id.length() == 0) { id = getAttributeNS(e, ANDROID_URI, ATTR_SRC); if (id != null && id.length() > 0) { if (id.startsWith(DRAWABLE_PREFIX)) { id = id.substring(DRAWABLE_PREFIX.length()); } } else { id = e.getAttribute(ATTR_LAYOUT); if (id != null && id.length() > 0) { if (id.startsWith(LAYOUT_RESOURCE_PREFIX)) { id = id.substring(LAYOUT_RESOURCE_PREFIX.length()); } } } } } } } if (id != null && id.length() > 0) { return text + ": " + id; //$NON-NLS-1$ } } return text; } /** * Wrapper around {@link Element#getAttributeNS(String, String)}. * <p/> * The implementation used in Eclipse's XML editor sometimes internally * throws an NPE instead of politely returning null. * * @see Element#getAttributeNS(String, String) */ private String getAttributeNS(Element e, String uri, String name) throws DOMException { try { return e.getAttributeNS(uri, name); } catch (NullPointerException ignore) { return null; } } }