| /******************************************************************************* |
| * Copyright (c) 2008, 2016 xored software, Inc. |
| * |
| * 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: |
| * xored software, Inc. - initial API and Implementation (Alex Panchenko) |
| *******************************************************************************/ |
| package org.eclipse.dltk.ruby.internal.ui; |
| |
| import org.eclipse.core.resources.IStorage; |
| import org.eclipse.dltk.core.IBuildpathEntry; |
| import org.eclipse.dltk.core.IMethod; |
| import org.eclipse.dltk.core.IModelElement; |
| import org.eclipse.dltk.core.IProjectFragment; |
| import org.eclipse.dltk.core.IScriptFolder; |
| import org.eclipse.dltk.core.ISourceModule; |
| import org.eclipse.dltk.core.IType; |
| import org.eclipse.dltk.core.ModelException; |
| import org.eclipse.dltk.core.environment.EnvironmentPathUtils; |
| import org.eclipse.dltk.ui.ScriptElementLabels; |
| import org.eclipse.dltk.ui.viewsupport.StorageLabelProvider; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.swt.graphics.Image; |
| |
| public class RubyLabelProvider extends LabelProvider { |
| |
| public static final String PACKAGE_SEPARATOR = "::"; //$NON-NLS-1$ |
| public static final String SEPARATOR = " - "; //$NON-NLS-1$ |
| public static final String FOLDER_SEPARATOR = "/"; //$NON-NLS-1$ |
| public static final String METHOD_SEPARATOR = "#"; //$NON-NLS-1$ |
| |
| private final StorageLabelProvider fStorageLabelProvider; |
| |
| public RubyLabelProvider() { |
| fStorageLabelProvider = new StorageLabelProvider(); |
| } |
| |
| @Override |
| public Image getImage(Object element) { |
| if (element instanceof IStorage) { |
| return fStorageLabelProvider.getImage(element); |
| } |
| return null; |
| } |
| |
| @Override |
| public String getText(Object element) { |
| if (element instanceof ISourceModule) { |
| final StringBuffer sb = new StringBuffer(); |
| appendSourceModule((ISourceModule) element, sb); |
| return sb.toString(); |
| } else if (element instanceof IType) { |
| final StringBuffer sb = new StringBuffer(); |
| appendQualifiedType((IType) element, sb); |
| return sb.toString(); |
| } else if (element instanceof IMethod) { |
| final StringBuffer sb = new StringBuffer(); |
| appendQualifiedMethod((IMethod) element, sb); |
| return sb.toString(); |
| } |
| return super.getText(element); |
| } |
| |
| @Override |
| public void dispose() { |
| fStorageLabelProvider.dispose(); |
| } |
| |
| public static void appendQualifiedMethod(IMethod method, StringBuffer sb) { |
| final IModelElement parent = method.getParent(); |
| final IType type; |
| if (parent instanceof IType) { |
| type = (IType) parent; |
| } else { |
| type = null; |
| } |
| if (type != null) { |
| ISourceModule module = appendType(type, sb); |
| sb.append(METHOD_SEPARATOR); |
| sb.append(method.getElementName()); |
| String[] parameters; |
| try { |
| parameters = method.getParameterNames(); |
| } catch (ModelException e) { |
| parameters = null; |
| } |
| if (parameters != null) { |
| sb.append('('); |
| for (int i = 0; i < parameters.length; ++i) { |
| if (i != 0) { |
| sb.append(", "); //$NON-NLS-1$ |
| } |
| sb.append(parameters[i]); |
| } |
| sb.append(')'); |
| } |
| if (module != null) { |
| sb.append(SEPARATOR); |
| appendSourceModule(module, sb); |
| } |
| } |
| } |
| |
| public static void appendQualifiedType(IType type, StringBuffer sb) { |
| sb.append(type.getElementName()); |
| final IModelElement parent = type.getParent(); |
| final ISourceModule parentModule; |
| if (parent instanceof IType) { |
| sb.append(SEPARATOR); |
| parentModule = appendType((IType) parent, sb); |
| } else if (parent instanceof ISourceModule) { |
| parentModule = (ISourceModule) parent; |
| } else { |
| parentModule = null; |
| } |
| if (parentModule != null) { |
| sb.append(SEPARATOR); |
| appendSourceModule(parentModule, sb); |
| } |
| } |
| |
| private static ISourceModule appendType(IType type, StringBuffer sb) { |
| final IModelElement parent = type.getParent(); |
| if (parent instanceof IType) { |
| final ISourceModule module = appendType((IType) parent, sb); |
| sb.append(PACKAGE_SEPARATOR); |
| sb.append(type.getElementName()); |
| return module; |
| } else { |
| sb.append(type.getElementName()); |
| if (parent instanceof ISourceModule) { |
| return (ISourceModule) parent; |
| } else { |
| return null; |
| } |
| } |
| } |
| |
| public static void appendSourceModule(ISourceModule module, StringBuffer sb) { |
| final IModelElement parent = module.getParent(); |
| final IProjectFragment fragment; |
| if (parent instanceof IScriptFolder) { |
| fragment = appendScriptFolder((IScriptFolder) parent, sb); |
| } else { |
| fragment = null; |
| } |
| sb.append(module.getElementName()); |
| if (fragment != null) { |
| if (!fragment.isArchive()) { |
| if (fragment.getPath().toString().startsWith( |
| IBuildpathEntry.BUILTIN_EXTERNAL_ENTRY_STR)) { |
| sb.append(' '); |
| sb.append(ScriptElementLabels.BUILTINS_FRAGMENT); |
| } else if (fragment.isExternal()) { |
| sb.append(SEPARATOR); |
| sb.append(EnvironmentPathUtils.getLocalPath( |
| fragment.getPath()).toPortableString()); |
| } |
| } |
| } |
| } |
| |
| private static IProjectFragment appendScriptFolder(IScriptFolder folder, |
| StringBuffer sb) { |
| final IModelElement parent = folder.getParent(); |
| final IProjectFragment fragment; |
| if (parent instanceof IScriptFolder) { |
| fragment = appendScriptFolder((IScriptFolder) parent, sb); |
| } else if (parent instanceof IProjectFragment) { |
| fragment = (IProjectFragment) parent; |
| } else { |
| fragment = null; |
| } |
| if (!folder.isRootFolder()) { |
| sb.append(folder.getElementName()); |
| sb.append(FOLDER_SEPARATOR); |
| } |
| return fragment; |
| } |
| |
| } |