/******************************************************************************* * Copyright (c) 2009 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.jst.jsp.ui.internal.views.contentoutline; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP11TLDNames; import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP12TLDNames; import org.eclipse.jst.jsp.ui.internal.JSPUIMessages; import org.eclipse.jst.jsp.ui.internal.JSPUIPlugin; import org.eclipse.swt.graphics.Image; import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateAction; import org.eclipse.wst.sse.ui.internal.contentoutline.PropertyChangeUpdateActionContributionItem; import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImageHelper; import org.eclipse.wst.sse.ui.internal.editor.EditorPluginImages; import org.eclipse.wst.xml.ui.views.contentoutline.XMLContentOutlineConfiguration; import org.w3c.dom.Element; import org.w3c.dom.EntityReference; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class TLDContentOutlineConfiguration extends XMLContentOutlineConfiguration { private class ContentLabelProvider implements ILabelProvider { ILabelProvider fParentProvider = null; ContentLabelProvider(ILabelProvider parent) { super(); fParentProvider = parent; } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse * .jface.viewers.ILabelProviderListener) */ public void addListener(ILabelProviderListener listener) { fParentProvider.addListener(listener); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose() */ public void dispose() { fParentProvider.dispose(); } private String firstLineOf(String text) { if (text == null || text.length() < 1 || (text.indexOf('\r') < 0 && text.indexOf('\n') < 0)) { return text; } int start = 0; int maxLength = text.length(); while (start < maxLength && text.charAt(start) == '\r' || text.charAt(start) == '\n') start++; int endN = text.indexOf('\n', start); int endR = text.indexOf('\r', start); // no more line delimiters if (endN < 0 && endR < 0) { if (start == 0) { // no leading line delimiters, return as-is return text; } else { // cut leading line delimiters return text.substring(start); } } if (endN < 0) { /* no \r cut leading line delimiters up to first \r */ return text.substring(start, endR); } if (endR < 0) { /* no \r cut leading line delimiters up to first \n */ return text.substring(start, endN); } /* * Both \n and \r, cut leading line delimiters up to whichever is * first */ return text.substring(start, Math.min(endN, endR)); } private String getContainedText(Node parent) { NodeList children = parent.getChildNodes(); if (children.getLength() == 1) { return getValue(children.item(0)); } StringBuffer s = new StringBuffer(); Node child = parent.getFirstChild(); while (child != null) { if (child.getNodeType() == Node.ENTITY_REFERENCE_NODE) { String reference = ((EntityReference) child).getNodeValue(); if (reference == null && child.getNodeName() != null) { reference = "&" + child.getNodeName() + ";"; //$NON-NLS-1$ //$NON-NLS-2$ } if (reference != null) { s.append(reference.trim()); } } else { s.append(getValue(child)); } child = child.getNextSibling(); } return s.toString().trim(); } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object) */ public Image getImage(Object element) { return fParentProvider.getImage(element); } /** * @param domElement * @return */ private String getNameValue(Element domElement) { NodeList names = domElement.getElementsByTagName(JSP11TLDNames.NAME); String name = null; for (int i = 0; i < names.getLength() && (name == null || name.length() == 0); i++) { name = getContainedText(names.item(i)); } return name; } /** * @param domElement * @return */ private String getShortNameValue(Element domElement) { NodeList names = domElement.getElementsByTagName(JSP12TLDNames.SHORT_NAME); String name = null; for (int i = 0; i < names.getLength() && (name == null || name.length() == 0); i++) { name = getContainedText(names.item(i)); } names = domElement.getElementsByTagName(JSP11TLDNames.SHORTNAME); for (int i = 0; i < names.getLength() && (name == null || name.length() == 0); i++) { name = getContainedText(names.item(i)); } return name; } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) */ public String getText(Object element) { if (fShowContentValues && element instanceof Element) { Element domElement = (Element) element; String name = domElement.getNodeName(); boolean showName = JSP11TLDNames.TAG.equals(name); showName = showName || JSP11TLDNames.ATTRIBUTE.equals(name); if (showName) { String value = getNameValue(domElement); if (value != null && value.length() > 0) { /** * Currently not externalized since it's analagous to * a decorator. */ return fParentProvider.getText(domElement) + " [" + firstLineOf(value) + "]"; //$NON-NLS-1$ } } boolean showContents = JSP11TLDNames.NAME.equals(name); showContents = showContents || JSP11TLDNames.BODYCONTENT.equals(name); showContents = showContents || JSP12TLDNames.BODY_CONTENT.equals(name); showContents = showContents || JSP11TLDNames.TAGCLASS.equals(name); showContents = showContents || JSP12TLDNames.TAG_CLASS.equals(name); showContents = showContents || JSP11TLDNames.TEICLASS.equals(name); showContents = showContents || JSP12TLDNames.TEI_CLASS.equals(name); showContents = showContents || JSP11TLDNames.REQUIRED.equals(name); showContents = showContents || JSP11TLDNames.RTEXPRVALUE.equals(name); showContents = showContents || JSP11TLDNames.URI.equals(name); showContents = showContents || JSP11TLDNames.SHORTNAME.equals(name); showContents = showContents || JSP12TLDNames.SHORT_NAME.equals(name); showContents = showContents || JSP12TLDNames.DISPLAY_NAME.equals(name); showContents = showContents || JSP11TLDNames.JSPVERSION.equals(name); showContents = showContents || JSP12TLDNames.JSP_VERSION.equals(name); showContents = showContents || JSP11TLDNames.TLIBVERSION.equals(name); showContents = showContents || JSP12TLDNames.TLIB_VERSION.equals(name); showContents = showContents || JSP12TLDNames.LISTENER_CLASS.equals(name); showContents = showContents || JSP12TLDNames.VARIABLE_SCOPE.equals(name); showContents = showContents || JSP12TLDNames.VARIABLE_CLASS.equals(name); showContents = showContents || JSP12TLDNames.VARIABLE_DECLARE.equals(name); showContents = showContents || JSP12TLDNames.VARIABLE_NAME_FROM_ATTRIBUTE.equals(name); showContents = showContents || JSP12TLDNames.VARIABLE_NAME_GIVEN.equals(name); showContents = showContents || JSP12TLDNames.VALIDATOR_CLASS.equals(name); showContents = showContents || JSP12TLDNames.SMALL_ICON.equals(name); showContents = showContents || JSP12TLDNames.LARGE_ICON.equals(name); if (showContents) { return fParentProvider.getText(domElement) + ": " + getContainedText(domElement); //$NON-NLS-1$ } if (JSP11TLDNames.TAGLIB.equals(name)) { String value = getShortNameValue(domElement); if (value != null && value.length() > 0) { /** * Currently not externalized since it's analagous to * a decorator. */ return fParentProvider.getText(domElement) + " [" + value + "]"; //$NON-NLS-1$ } } } return fParentProvider.getText(element); } private String getValue(Node n) { if (n == null) return ""; //$NON-NLS-1$ String value = n.getNodeValue(); if (value == null) return ""; //$NON-NLS-1$ return value.trim(); } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java * .lang.Object, java.lang.String) */ public boolean isLabelProperty(Object element, String property) { return fParentProvider.isLabelProperty(element, property); } /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org * .eclipse.jface.viewers.ILabelProviderListener) */ public void removeListener(ILabelProviderListener listener) { fParentProvider.removeListener(listener); } } /** * Toggle action for whether or not to display element's first attribute */ private class ToggleShowValueAction extends PropertyChangeUpdateAction { private TreeViewer fTreeViewer; public ToggleShowValueAction(IPreferenceStore store, String preference, TreeViewer treeViewer) { super(JSPUIMessages.TLDContentOutlineConfiguration_0, store, preference, true); setToolTipText(getText()); // TODO: image needed setImageDescriptor(EditorPluginImageHelper.getInstance().getImageDescriptor(EditorPluginImages.IMG_OBJ_PROP_PS)); fTreeViewer = treeViewer; update(); } /* * (non-Javadoc) * * @see org.eclipse.ui.texteditor.IUpdate#update() */ public void update() { super.update(); fShowContentValues = isChecked(); // refresh the outline view fTreeViewer.refresh(true); } } /* * Preference key for Show Attributes */ private final String OUTLINE_SHOW_VALUE_PREF = "outline-show-value"; //$NON-NLS-1$ boolean fShowContentValues = true; ILabelProvider fLabelProvider = null; public TLDContentOutlineConfiguration() { super(); } protected IContributionItem[] createMenuContributions(TreeViewer viewer) { IContributionItem[] items; IContributionItem showValueItem = new PropertyChangeUpdateActionContributionItem(new ToggleShowValueAction(getPreferenceStore(), OUTLINE_SHOW_VALUE_PREF, viewer)); items = super.createMenuContributions(viewer); if (items == null) { items = new IContributionItem[]{showValueItem}; } else { IContributionItem[] combinedItems = new IContributionItem[items.length + 1]; System.arraycopy(items, 0, combinedItems, 0, items.length); combinedItems[items.length] = showValueItem; items = combinedItems; } return items; } /* * (non-Javadoc) * * @see * org.eclipse.wst.xml.ui.views.contentoutline.XMLContentOutlineConfiguration * #getLabelProvider(org.eclipse.jface.viewers.TreeViewer) */ public ILabelProvider getLabelProvider(TreeViewer viewer) { if (fLabelProvider == null) { fLabelProvider = new ContentLabelProvider(super.getLabelProvider(viewer)); } return fLabelProvider; } /* * (non-Javadoc) * * @see * org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration * #getPreferenceStore() */ protected IPreferenceStore getPreferenceStore() { return JSPUIPlugin.getDefault().getPreferenceStore(); } }