/******************************************************************************* * Copyright (c) 2006, 2010 QNX Software Systems 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: * QNX - Initial API and implementation * Markus Schorn (Wind River Systems) * IBM Corporation * Andrew Ferguson (Symbian) * Bryan Wilkinson (QNX) *******************************************************************************/ package org.eclipse.cdt.internal.ui.indexview; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.model.ICContainer; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.CDTSharedImages; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode; import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider; /** * Common label provider for index based viewers. * * @author Doug Schaefer */ public class IndexLabelProvider extends LabelProvider { @Override public String getText(Object element) { if (element instanceof IndexNode) { return ((IndexNode) element).fText; } return super.getText(element); } @Override public Image getImage(Object element) { if (element instanceof IndexNode) { return ((IndexNode) element).fImage; } ImageDescriptor desc= null; if (element instanceof ICProject) desc = CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_SEARCHPROJECT); else if (element instanceof ICContainer) desc = CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_SEARCHFOLDER); else if (element instanceof ITranslationUnit) { ITranslationUnit tu = (ITranslationUnit)element; desc = tu.isHeaderUnit() ? CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_TUNIT_HEADER) : CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_TUNIT); } if (desc != null) return CUIPlugin.getImageDescriptorRegistry().get(desc); return super.getImage(element); } public static String getText(IPDOMNode element) { if (element instanceof PDOMNamedNode) { try { String result = ((PDOMNamedNode)element).getDBName().getString(); if (element instanceof ICPPTemplateInstance) { StringBuffer buffer = null; if (element instanceof ICPPDeferredClassInstance) { buffer = new StringBuffer("Dfrd: "); //$NON-NLS-1$ } else { buffer = new StringBuffer("Inst: "); //$NON-NLS-1$ } buffer.append(result); buffer.append('<'); ICPPTemplateArgument[] types = ((ICPPTemplateInstance) element).getTemplateArguments(); for (int i = 0; i < types.length; i++) { if (i > 0) buffer.append(','); buffer.append(ASTTypeUtil.getArgumentString(types[i], false)); } buffer.append('>'); result = buffer.toString(); } else if (element instanceof ICPPClassTemplatePartialSpecialization) { StringBuffer buffer = new StringBuffer("Part: "); //$NON-NLS-1$ buffer.append(result); buffer.append('<'); try { ICPPTemplateArgument[] types = ((ICPPClassTemplatePartialSpecialization) element).getTemplateArguments(); for (int i = 0; i < types.length; i++) { if (i > 0) buffer.append(','); buffer.append(ASTTypeUtil.getArgumentString(types[i], false)); } } catch (DOMException e) { buffer.append(e.getProblem().toString()); } buffer.append('>'); result = buffer.toString(); } else if (element instanceof ICPPSpecialization) { ICPPSpecialization spec = (ICPPSpecialization) element; StringBuffer buffer = null; buffer = new StringBuffer("Spec: "); //$NON-NLS-1$ buffer.append(result); if (!(spec instanceof ICPPTemplateDefinition) && spec.getSpecializedBinding() instanceof ICPPTemplateDefinition) { buffer.append('<'); buffer.append(((ICPPSpecialization) element).getTemplateParameterMap().toString()); buffer.append('>'); } result = buffer.toString(); } /* * aftodo - Ideally here we'd call ASTTypeUtil.getType but * we don't currently store return types */ if(element instanceof IFunction) { result += " "+ASTTypeUtil.getParameterTypeString(((IFunction) element).getType()); //$NON-NLS-1$ } return result; } catch (CoreException e) { return e.getMessage(); } } return ""; //$NON-NLS-1$ } public static Image getImage(IPDOMNode element) { ImageDescriptor desc = null; if (element instanceof IVariable) desc = CElementImageProvider.getVariableImageDescriptor(); else if (element instanceof IFunction) desc = CElementImageProvider.getFunctionImageDescriptor(); else if (element instanceof ICPPClassType) { switch (((ICPPClassType)element).getKey()) { case ICPPClassType.k_class: desc = CElementImageProvider.getClassImageDescriptor(); break; case ICompositeType.k_struct: desc = CElementImageProvider.getStructImageDescriptor(); break; case ICompositeType.k_union: desc = CElementImageProvider.getUnionImageDescriptor(); break; } } else if (element instanceof ICompositeType) desc = CElementImageProvider.getStructImageDescriptor(); else if (element instanceof ICPPNamespace) desc = CElementImageProvider.getNamespaceImageDescriptor(); else if (element instanceof IEnumeration) desc = CElementImageProvider.getEnumerationImageDescriptor(); else if (element instanceof IEnumerator) desc = CElementImageProvider.getEnumeratorImageDescriptor(); else if (element instanceof ITypedef) desc = CElementImageProvider.getTypedefImageDescriptor(); if (desc != null) return CUIPlugin.getImageDescriptorRegistry().get(desc); else if (element instanceof PDOMLinkage) return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT); return null; } }