package org.bndtools.core.editors.pkginfo;
import org.bndtools.api.BndtoolsConstants;
import org.bndtools.api.ILogger;
import org.bndtools.api.Logger;
import org.bndtools.utils.swt.SWTConcurrencyUtil;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.ide.ResourceUtil;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import bndtools.Plugin;
public class PackageInfoEditor extends TextEditor implements IResourceChangeListener {
private static final ILogger LOGGER = Logger.getLogger(PackageInfoEditor.class);
private Image imgTitleBase;
private Image imgTitleWarning;
private Image imgTitleError;
private Image titleImage;
@Override
public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) {
super.setInitializationData(cfig, propertyName, data);
String strIcon = cfig.getAttribute("icon");
// Load the icons
ImageDescriptor baseImageDesc = strIcon != null ? AbstractUIPlugin.imageDescriptorFromPlugin(cfig.getContributor().getName(), strIcon) : null;
imgTitleBase = baseImageDesc != null ? baseImageDesc.createImage() : getDefaultImage();
ImageDescriptor imgWarningOverlay = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "icons/warning_co.gif");
DecorationOverlayIcon warningImageDesc = new DecorationOverlayIcon(imgTitleBase, imgWarningOverlay, IDecoration.BOTTOM_LEFT);
imgTitleWarning = warningImageDesc.createImage();
ImageDescriptor imgErrorOverlay = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "icons/error_co.gif");
DecorationOverlayIcon errorImageDesc = new DecorationOverlayIcon(imgTitleBase, imgErrorOverlay, IDecoration.BOTTOM_LEFT);
imgTitleError = errorImageDesc.createImage();
titleImage = imgTitleBase;
}
@Override
protected void initializeEditor() {
super.initializeEditor();
setDocumentProvider(new PackageInfoDocumentProvider());
setRulerContextMenuId("#PackageInfoRuleContext");
setSourceViewerConfiguration(new PackageInfoSourceViewerConfiguration());
}
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
super.init(site, input);
updateTitleIcon();
IResource resource = ResourceUtil.getResource(getEditorInput());
if (resource != null)
resource.getWorkspace().addResourceChangeListener(this);
}
void updateTitleIcon() {
IResource resource = ResourceUtil.getResource(getEditorInput());
if (resource == null)
return;
int severity = IMarker.SEVERITY_INFO;
try {
IMarker[] markers = resource.findMarkers(BndtoolsConstants.MARKER_BND_PROBLEM, true, 0);
if (markers != null) {
for (IMarker marker : markers)
severity = Math.max(severity, marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO));
}
} catch (CoreException e) {
LOGGER.logError("Error updating packageinfo editor title icon", e);
}
if (severity >= IMarker.SEVERITY_ERROR) {
titleImage = imgTitleError;
} else if (severity >= IMarker.SEVERITY_WARNING) {
titleImage = imgTitleWarning;
} else {
titleImage = imgTitleBase;
}
firePropertyChange(PROP_TITLE);
}
@Override
public Image getTitleImage() {
if (titleImage != null)
return titleImage;
return getDefaultImage();
}
@Override
public void dispose() {
IResource resource = ResourceUtil.getResource(getEditorInput());
super.dispose();
if (resource != null)
resource.getWorkspace().removeResourceChangeListener(this);
if (imgTitleBase != null)
imgTitleBase.dispose();
if (imgTitleWarning != null)
imgTitleWarning.dispose();
if (imgTitleError != null)
imgTitleError.dispose();
}
public void resourceChanged(IResourceChangeEvent event) {
IResource resource = ResourceUtil.getResource(getEditorInput());
IResourceDelta delta = event.getDelta();
if (delta == null)
return;
IPath path = resource.getFullPath();
delta = delta.findMember(path);
if (delta == null)
return;
if ((delta.getFlags() & IResourceDelta.MARKERS) != 0)
SWTConcurrencyUtil.execForControl(getEditorSite().getShell(), true, new Runnable() {
public void run() {
updateTitleIcon();
}
});
}
}