blob: ca54c10eb2156f8a16001ceb127131497109bc9b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2017 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
*
*******************************************************************************/
package org.eclipse.dltk.ui.viewsupport;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.ui.DLTKUILanguageManager;
import org.eclipse.dltk.ui.IDLTKUILanguageToolkit;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IFileEditorMapping;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
public class StorageLabelProvider extends LabelProvider {
private IEditorRegistry fEditorRegistry = null;
private Map<String, Image> fImageMap = new HashMap<>(10);
private Image fDefaultImage;
private IEditorRegistry getEditorRegistry() {
if (fEditorRegistry == null)
fEditorRegistry = PlatformUI.getWorkbench().getEditorRegistry();
return fEditorRegistry;
}
@Override
public Image getImage(Object element) {
if (element instanceof ISourceModule) {
return getImageForEntry((ISourceModule) element);
} else if (element instanceof IStorage) {
return getImageForEntry((IStorage) element);
}
return super.getImage(element);
}
@Override
public String getText(Object element) {
if (element instanceof IStorage)
return ((IStorage) element).getName();
return super.getText(element);
}
@Override
public void dispose() {
if (fImageMap != null) {
for (Image image : fImageMap.values()) {
image.dispose();
}
fImageMap = null;
}
fDefaultImage = null;
}
/*
* Gets and caches an image for a ArchiveEntryFile. The image for a
* ArchiveEntryFile is retrieved from the EditorRegistry.
*/
private Image getImageForEntry(IStorage element) {
if (fImageMap == null)
return getDefaultImage();
if (element == null || element.getName() == null)
return getDefaultImage();
// Try to find icon for full name
String name = element.getName();
Image image = fImageMap.get(name);
if (image != null)
return image;
IFileEditorMapping[] mappings = getEditorRegistry()
.getFileEditorMappings();
int i = 0;
while (i < mappings.length) {
if (mappings[i].getLabel().equals(name))
break;
i++;
}
String key = name;
if (i == mappings.length) {
// Try to find icon for extension
IPath path = element.getFullPath();
if (path == null)
return getDefaultImage();
key = path.getFileExtension();
// if( key == null )
// return getDefaultImage();
if (key != null) {
image = fImageMap.get(key);
if (image != null)
return image;
}
}
// Get the image from the editor registry
ImageDescriptor desc = null;
// Use DLTK Based editor images for all editors.
IEditorDescriptor[] descs = getEditorRegistry().getEditors(name);
for (int e = 0; e < descs.length; ++e) {
String id = descs[e].getId();
if (id.indexOf("dltk") > 0) { //$NON-NLS-1$
desc = descs[e].getImageDescriptor();
}
}
if (desc == null) {
desc = getEditorRegistry().getImageDescriptor(name);
}
image = desc.createImage();
fImageMap.put(key, image);
return image;
}
private Image getImageForEntry(ISourceModule element) {
if (fImageMap == null)
return getDefaultImage();
if (element == null || element.getElementName() == null)
return getDefaultImage();
// Try to find icon for full name
String name = element.getElementName();
Image image = fImageMap.get(name);
if (image != null)
return image;
IFileEditorMapping[] mappings = getEditorRegistry()
.getFileEditorMappings();
int i = 0;
while (i < mappings.length) {
if (mappings[i].getLabel().equals(name))
break;
i++;
}
String key = name;
if (i == mappings.length) {
// Try to find icon for extension
IPath path = element.getPath();
if (path == null)
return getDefaultImage();
key = path.getFileExtension();
// if( key == null )
// return getDefaultImage();
if (key != null) {
image = fImageMap.get(key);
if (image != null)
return image;
}
}
// Get the image from the editor registry
// ImageDescriptor desc = getEditorRegistry().getImageDescriptor(name);
// Get the image from the editor registry
ImageDescriptor desc = null;
// Use DLTK Based editor images for all editors.
IDLTKUILanguageToolkit toolkit = DLTKUILanguageManager
.getLanguageToolkit(element);
if (toolkit == null) {
return null;
}
String editorID = toolkit.getEditorId(element);
IEditorDescriptor ed = getEditorRegistry().findEditor(editorID);
if (ed != null) {
desc = ed.getImageDescriptor();
}
if (desc == null) {
desc = getEditorRegistry().getImageDescriptor(name);
}
image = desc.createImage();
fImageMap.put(key, image);
return image;
}
private Image getDefaultImage() {
if (fDefaultImage == null)
fDefaultImage = PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_OBJ_FILE);
return fDefaultImage;
}
}