/*******************************************************************************
 * Copyright (c) 2009 Zoltan Ujhelyi and Daniel Varro.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Zoltan Ujhelyi - initial API and implementation
 *******************************************************************************/
package org.eclipse.viatra2.visualisation;

import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Color;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.themes.ITheme;
import org.eclipse.ui.themes.IThemeManager;

/**
 * An abstract label provider class that listens to changes in the platform
 * color registry.
 * @author Zoltan Ujhelyi
 */
public abstract class ViatraColoredLabelProvider extends LabelProvider {

	protected Color ENTITY_BG, ENTITY_HL, ENTITY_FG, ENTITY_BO, ENTITY_BOHL;
	protected Color RELATION_BG, RELATION_HL, RELATION_FG, RELATION_BO,
			RELATION_BOHL;
	protected Color PATTERN_BG, PATTERN_HL, PATTERN_FG, PATTERN_BO,
			PATTERN_BOHL;
	protected Color ARC, ARC_HL;
	protected Color PARAM, PARAM_HL;
	private ITheme theme;
	private IPropertyChangeListener listener = new IPropertyChangeListener() {

		public void propertyChange(PropertyChangeEvent event) {
			reloadColors();
		}
	};

	/**
	 * Initializes the colored label provider and loads the color theme
	 * information from the color registry.
	 */
	public ViatraColoredLabelProvider() {
		super();
		IThemeManager themeManager = PlatformUI.getWorkbench()
				.getThemeManager();
		ITheme currentTheme = themeManager.getCurrentTheme();
		loadTheme(currentTheme);
	}

	/**
	 * Loads the color information from a theme
	 * @param theme
	 *            the theme to load
	 */
	public void loadTheme(ITheme theme) {
		if (this.theme != null)
			this.theme.removePropertyChangeListener(listener);
		this.theme = theme;
		this.theme.addPropertyChangeListener(listener);
		reloadColors();
	}

	/**
	 * <p>
	 * Reloads the color theme from the Color Registry of the currently selected
	 * theme.
	 * </p>
	 * <p>
	 * <strong>Warning!</strong> Reloading the colors does not trigger the
	 * redraw of the graph, so changes might not be visible instantly.
	 * </p>
	 */
	public void reloadColors() {
		ColorRegistry colorRegistry = theme.getColorRegistry();
		ENTITY_BG = colorRegistry
				.get("org.eclipse.viatra2.visualisation.entity.background");
		ENTITY_HL = colorRegistry
				.get("org.eclipse.viatra2.visualisation.entity.highlight");
		ENTITY_FG = colorRegistry
				.get("org.eclipse.viatra2.visualisation.entity.foreground");
		ENTITY_BO = colorRegistry
				.get("org.eclipse.viatra2.visualisation.entity.border");
		ENTITY_BOHL = colorRegistry
				.get("org.eclipse.viatra2.visualisation.entity.borderhighlight");
		RELATION_BG = colorRegistry
				.get("org.eclipse.viatra2.visualisation.relation.background");
		RELATION_HL = colorRegistry
				.get("org.eclipse.viatra2.visualisation.relation.highlight");
		RELATION_FG = colorRegistry
				.get("org.eclipse.viatra2.visualisation.relation.foreground");
		RELATION_BO = colorRegistry
				.get("org.eclipse.viatra2.visualisation.relation.border");
		RELATION_BOHL = colorRegistry
				.get("org.eclipse.viatra2.visualisation.relation.borderhighlight");
		PATTERN_BG = colorRegistry
				.get("org.eclipse.viatra2.visualisation.pattern.background");
		PATTERN_HL = colorRegistry
				.get("org.eclipse.viatra2.visualisation.pattern.highlight");
		PATTERN_FG = colorRegistry
				.get("org.eclipse.viatra2.visualisation.pattern.foreground");
		PATTERN_BO = colorRegistry
				.get("org.eclipse.viatra2.visualisation.pattern.border");
		PATTERN_BOHL = colorRegistry
				.get("org.eclipse.viatra2.visualisation.pattern.borderhighlight");
		ARC = colorRegistry.get("org.eclipse.viatra2.visualisation.arc");
		ARC_HL = colorRegistry
				.get("org.eclipse.viatra2.visualisation.archighlight");
		PARAM = colorRegistry
				.get("org.eclipse.viatra2.visualisation.parameter");
		PARAM_HL = colorRegistry
				.get("org.eclipse.viatra2.visualisation.parameterhighlight");
	}

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

}