| /******************************************************************************* |
| * Copyright (c) 2000, 2017 IBM Corporation and others. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.dltk.internal.ui.navigator; |
| |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IFolder; |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.dltk.core.IScriptFolder; |
| import org.eclipse.dltk.ui.ScriptElementImageProvider; |
| import org.eclipse.dltk.ui.ScriptElementLabels; |
| import org.eclipse.dltk.ui.viewsupport.AppearanceAwareLabelProvider; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.viewers.StyledCellLabelProvider; |
| import org.eclipse.jface.viewers.StyledString; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.ui.IWorkingSet; |
| |
| /** |
| * Provides the labels for the Package Explorer. |
| * <p> |
| * It provides labels for the packages in hierarchical layout and in all other |
| * cases delegates it to its super class. |
| * </p> |
| */ |
| public class ScriptExplorerLabelProvider extends AppearanceAwareLabelProvider { |
| |
| protected ScriptExplorerContentProvider fContentProvider; |
| private Map<ImageDescriptor, Image> fWorkingSetImages; |
| |
| private boolean fIsFlatLayout; |
| private ScriptExplorerProblemsDecorator fProblemDecorator; |
| |
| public ScriptExplorerLabelProvider(ScriptExplorerContentProvider cp, |
| IPreferenceStore store) { |
| super(DEFAULT_TEXTFLAGS | ScriptElementLabels.P_COMPRESSED |
| | ScriptElementLabels.REFERENCED_ARCHIVE_POST_QUALIFIED |
| | ScriptElementLabels.ALL_CATEGORY, |
| DEFAULT_IMAGEFLAGS | ScriptElementImageProvider.SMALL_ICONS, |
| store); |
| |
| fProblemDecorator = new ScriptExplorerProblemsDecorator(); |
| addLabelDecorator(fProblemDecorator); |
| Assert.isNotNull(cp); |
| fContentProvider = cp; |
| fWorkingSetImages = null; |
| } |
| |
| private String getSpecificText(Object element) { |
| if (!fIsFlatLayout && element instanceof IScriptFolder) { |
| IScriptFolder fragment = (IScriptFolder) element; |
| Object parent = fContentProvider |
| .getHierarchicalPackageParent(fragment); |
| if (parent instanceof IScriptFolder) { |
| return getNameDelta((IScriptFolder) parent, fragment); |
| } else if (parent instanceof IFolder) { // bug 152735 |
| return getNameDelta((IFolder) parent, fragment); |
| } |
| } else if (element instanceof IWorkingSet) { |
| return ((IWorkingSet) element).getLabel(); |
| } |
| return null; |
| } |
| |
| @Override |
| public String getText(Object element) { |
| String text = getSpecificText(element); |
| if (text != null) { |
| return decorateText(text, element); |
| } |
| return super.getText(element); |
| } |
| |
| @Override |
| public StyledString getStyledText(Object element) { |
| String text = getSpecificText(element); |
| if (text != null) { |
| String decorated = decorateText(text, element); |
| if (decorated != null) { |
| return StyledCellLabelProvider.styleDecoratedString(decorated, |
| StyledString.DECORATIONS_STYLER, |
| new StyledString(text)); |
| } |
| } |
| return super.getStyledText(element); |
| } |
| |
| private String getNameDelta(IScriptFolder parent, IScriptFolder fragment) { |
| String prefix = parent.getElementName() |
| + IScriptFolder.PACKAGE_DELIMITER; |
| String fullName = fragment.getElementName(); |
| if (fullName.startsWith(prefix)) { |
| return fullName.substring(prefix.length()); |
| } |
| return fullName; |
| } |
| |
| private String getNameDelta(IFolder parent, IScriptFolder fragment) { |
| IPath prefix = parent.getFullPath(); |
| IPath fullPath = fragment.getPath(); |
| if (prefix.isPrefixOf(fullPath)) { |
| StringBuffer buf = new StringBuffer(); |
| for (int i = prefix.segmentCount(); i < fullPath |
| .segmentCount(); i++) { |
| if (buf.length() > 0) |
| buf.append(IScriptFolder.PACKAGE_DELIMITER); |
| buf.append(fullPath.segment(i)); |
| } |
| return buf.toString(); |
| } |
| return fragment.getElementName(); |
| } |
| |
| @Override |
| public Image getImage(Object element) { |
| if (element instanceof IWorkingSet) { |
| ImageDescriptor image = ((IWorkingSet) element) |
| .getImageDescriptor(); |
| if (fWorkingSetImages == null) { |
| fWorkingSetImages = new HashMap<>(); |
| } |
| |
| Image result = fWorkingSetImages.get(image); |
| if (result == null) { |
| result = image.createImage(); |
| fWorkingSetImages.put(image, result); |
| } |
| return decorateImage(result, element); |
| } |
| return super.getImage(element); |
| } |
| |
| public void setIsFlatLayout(boolean state) { |
| fIsFlatLayout = state; |
| fProblemDecorator.setIsFlatLayout(state); |
| } |
| |
| @Override |
| public void dispose() { |
| if (fWorkingSetImages != null) { |
| for (Iterator<Image> iter = fWorkingSetImages.values() |
| .iterator(); iter.hasNext();) { |
| iter.next().dispose(); |
| } |
| } |
| super.dispose(); |
| } |
| } |