blob: f747ebab87f48b78dc147576a3819270d6e015ab [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.ide.registry;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.ide.IMarkerImageProvider;
/**
* Implementation of a marker image registry which maps either
* a marker type to a provider or to a static image.
*/
public class MarkerImageProviderRegistry {
private static final String ATT_PROVIDER_CLASS = "class";//$NON-NLS-1$
private static final String ATT_ICON = "icon";//$NON-NLS-1$
private static final String ATT_MARKER_TYPE = "markertype";//$NON-NLS-1$
private static final String ATT_ID = "id";//$NON-NLS-1$
private static final String MARKER_ATT_KEY = "org.eclipse.ui.internal.registry.MarkerImageProviderRegistry";//$NON-NLS-1$
private static final String TAG_PROVIDER = "imageprovider";//$NON-NLS-1$
private ArrayList descriptors = new ArrayList();
class Descriptor {
String id;
String markerType;
String className;
String imagePath;
ImageDescriptor imageDescriptor;
IConfigurationElement element;
IPluginDescriptor pluginDescriptor;
IMarkerImageProvider provider;
}
/**
* Initialize this new MarkerImageProviderRegistry.
*/
public MarkerImageProviderRegistry() {
class MarkerImageReader extends IDERegistryReader {
protected boolean readElement(IConfigurationElement element) {
if (element.getName().equals(TAG_PROVIDER)) {
addProvider(element);
return true;
}
return false;
}
public void readRegistry() {
readRegistry(Platform.getPluginRegistry(), IDEWorkbenchPlugin.IDE_WORKBENCH, IDEWorkbenchPlugin.PL_MARKER_IMAGE_PROVIDER);
}
}
new MarkerImageReader().readRegistry();
}
/**
* Creates a descriptor for the marker provider extension
* and add it to the list of providers.
*/
public void addProvider(IConfigurationElement element) {
Descriptor desc = new Descriptor();
desc.element = element;
desc.pluginDescriptor = element.getDeclaringExtension().getDeclaringPluginDescriptor();
desc.id = element.getAttribute(ATT_ID);
desc.markerType = element.getAttribute(ATT_MARKER_TYPE);
desc.imagePath = element.getAttribute(ATT_ICON);
desc.className = element.getAttribute(ATT_PROVIDER_CLASS);
if(desc.imagePath != null) {
desc.imageDescriptor = getImageDescriptor(desc);
}
if(desc.className == null) {
//Don't need to keep these references.
desc.element = null;
desc.pluginDescriptor = null;
}
descriptors.add(desc);
}
/**
* @see IWorkbenchAdapter#getImageDescriptor
*/
public ImageDescriptor getImageDescriptor(IMarker marker) {
int size = descriptors.size();
for (int i = 0; i < size; i++) {
Descriptor desc = (Descriptor)descriptors.get(i);
try {
if(marker.isSubtypeOf(desc.markerType)) {
if(desc.className != null) {
if(desc.pluginDescriptor.isPluginActivated()) {
//-- Get the image descriptor from the provider.
//-- Save the image descriptor url as a persistable property, so a
//image descriptor can be created without activating the plugin next
//time the workbench is started.
if(desc.provider == null)
desc.provider = (IMarkerImageProvider)IDEWorkbenchPlugin.createExtension(
desc.element, ATT_PROVIDER_CLASS);
String path = desc.provider.getImagePath(marker);
if(path != desc.imagePath) {
desc.imagePath = path;
desc.imageDescriptor = getImageDescriptor(desc);
return desc.imageDescriptor;
}
return desc.imageDescriptor;
} else {
if(desc.imageDescriptor == null) {
//Create a image descriptor to be used until the plugin gets activated.
desc.imagePath = (String)marker.getAttribute(MARKER_ATT_KEY);
desc.imageDescriptor = getImageDescriptor(desc);
}
return desc.imageDescriptor;
}
} else if(desc.imageDescriptor != null) {
return desc.imageDescriptor;
}
}
} catch (CoreException e) {
IDEWorkbenchPlugin.getDefault().getLog().log(
new Status(
IStatus.ERROR,PlatformUI.PLUGIN_ID,0,
"Exception creating image descriptor for: " + desc.markerType,//$NON-NLS-1$
e));
return null;
}
}
return null;
}
/**
* Returns the image descriptor with the given relative path.
*/
ImageDescriptor getImageDescriptor(Descriptor desc) {
try {
URL installURL = desc.pluginDescriptor.getInstallURL();
URL url = new URL(installURL, desc.imagePath);
return ImageDescriptor.createFromURL(url);
}
catch (MalformedURLException e) {
return null;
}
}
}