package org.bndtools.core.ui;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.IFormPage;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.texteditor.ITextEditor;
/**
* A {@link FormEditor} that allows updating of tab titles, images and overlay images.
*
* @author Neil Bartlett
*/
public abstract class ExtendedFormEditor extends FormEditor {
private ITextEditor sourcePage;
private ImageDescriptor baseImageDescriptor;
private Image titleImage;
private ImageDescriptor overlaidTitleImageDescriptor;
private Image overlaidTitleImage;
@Override
public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) {
super.setInitializationData(cfig, propertyName, data);
String strIcon = cfig.getAttribute("icon");//$NON-NLS-1$
if (strIcon == null) {
return;
}
baseImageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin(cfig.getContributor().getName(), strIcon);
if (baseImageDescriptor == null) {
return;
}
titleImage = JFaceResources.getResources().createImageWithDefault(baseImageDescriptor);
}
@Override
public Image getTitleImage() {
if (overlaidTitleImage != null) {
return overlaidTitleImage;
}
if (titleImage != null) {
return titleImage;
}
return getDefaultImage();
}
@Override
public void dispose() {
super.dispose();
if (baseImageDescriptor != null)
JFaceResources.getResources().destroyImage(baseImageDescriptor);
if (overlaidTitleImageDescriptor != null)
JFaceResources.getResources().destroyImage(overlaidTitleImageDescriptor);
}
public void setOverlayTitleImage(ImageDescriptor overlay) {
if (overlay == null) {
overlaidTitleImage = null;
firePropertyChange(PROP_TITLE);
if (overlaidTitleImageDescriptor != null)
JFaceResources.getResources().destroyImage(overlaidTitleImageDescriptor);
overlaidTitleImageDescriptor = null;
} else {
DecorationOverlayIcon newOverlaidDesc = new DecorationOverlayIcon(titleImage, overlay, IDecoration.BOTTOM_LEFT);
overlaidTitleImage = JFaceResources.getResources().createImage(newOverlaidDesc);
firePropertyChange(PROP_TITLE);
if (overlaidTitleImageDescriptor != null)
JFaceResources.getResources().destroyImage(overlaidTitleImageDescriptor);
overlaidTitleImageDescriptor = newOverlaidDesc;
}
}
public void updatePageTitle(IFormPage page) {
int index = pages != null ? pages.indexOf(page) : -1;
if (index != -1) {
setPageImage(index, page.getTitleImage());
setPageText(index, page.getTitle());
}
}
@Override
protected void configurePage(int index, IFormPage page) throws PartInitException {
super.configurePage(index, page);
Image image = page.getTitleImage();
if (image != null)
setPageImage(index, page.getTitleImage());
}
public ITextEditor getSourcePage() {
return sourcePage;
}
protected void setSourcePage(ITextEditor sourcePage) {
this.sourcePage = sourcePage;
}
}