package org.eclipse.epf.authoring.ui.providers;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.epf.library.configuration.ConfigurationData;
import org.eclipse.epf.library.configuration.ConfigurationHelper;
import org.eclipse.epf.uma.ContentElement;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Display;

public class ConfigurationDecoratingLabelProvider extends
		DecoratingLabelProvider {

	private MethodConfiguration config;
	private Font italicFont = null;

	public ConfigurationDecoratingLabelProvider(MethodConfiguration config,
			AdapterFactory adapterFactory) {
		super(new ConfigurationLabelProvider(config, adapterFactory),
				new MethodElementLabelDecorator());
		this.config = config;
	}

	public Font getFont(Object element) {
		if (element instanceof ContentElement) {
			ConfigurationData configData = ConfigurationHelper.getDelegate().getConfigurationData(config);
			if (configData.isSuppressed((ContentElement) element)) {
				return getItalicFont();
			}
		}
		return super.getFont(element);
	}

	private Font getItalicFont() {
		if (italicFont == null) {
			italicFont = createFont(SWT.ITALIC);
		}

		return italicFont;
	}

	private Font createFont(int style) {
		FontData[] fontdata = Display.getCurrent().getSystemFont()
				.getFontData();
		for (FontData data : fontdata) {
			data.setStyle(style);
		}

		return new Font(Display.getCurrent(), fontdata);
	}

	@Override
	public void dispose() {
		super.dispose();
		if (italicFont != null) {
			italicFont.dispose();
		}
	}
	
}
