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;
	}

}
