/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ant.internal.ui.preferences;

import org.eclipse.ant.internal.ui.AntSourceViewerConfiguration;
import org.eclipse.ant.internal.ui.editor.formatter.FormattingPreferences;
import org.eclipse.ant.internal.ui.editor.formatter.XmlFormatter;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.texteditor.AbstractTextEditor;

/**
 * Handles changes for Ant preview viewers.
 * 
 * @since 3.0
 */
class AntPreviewerUpdater {

	private Color fForegroundColor = null;
	private Color fBackgroundColor = null;
	private Color fSelectionBackgroundColor = null;
	private Color fSelectionForegroundColor = null;

	/**
	 * Creates a source preview updater for the given viewer, configuration and preference store.
	 * 
	 * @param viewer
	 *            the viewer
	 * @param configuration
	 *            the configuration
	 * @param preferenceStore
	 *            the preference store
	 */
	public AntPreviewerUpdater(final SourceViewer viewer, final AntSourceViewerConfiguration configuration, final IPreferenceStore preferenceStore) {

		initializeViewerColors(viewer, preferenceStore);

		final IPropertyChangeListener fontChangeListener = event -> {
			if (event.getProperty().equals(JFaceResources.TEXT_FONT)) {
				Font font = JFaceResources.getFont(JFaceResources.TEXT_FONT);
				viewer.getTextWidget().setFont(font);
			}
		};
		final IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() {
			@Override
			public void propertyChange(PropertyChangeEvent event) {

				String property = event.getProperty();

				if (AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND.equals(property)
						|| AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT.equals(property)
						|| AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND.equals(property)
						|| AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT.equals(property)
						|| AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND.equals(property)
						|| AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT.equals(property)
						|| AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND.equals(property)
						|| AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT.equals(property)) {
					initializeViewerColors(viewer, preferenceStore);
				}

				if (configuration.affectsTextPresentation(event)) {
					configuration.adaptToPreferenceChange(event);
					viewer.invalidateTextPresentation();
				}

				if (FormattingPreferences.affectsFormatting(event)) {
					format(viewer, preferenceStore);
				}
			}

			/**
			 * @param viewer
			 * @param preferenceStore
			 */
			private void format(final SourceViewer sourceViewer, final IPreferenceStore store) {
				String contents = sourceViewer.getDocument().get();
				FormattingPreferences prefs = new FormattingPreferences();
				prefs.setPreferenceStore(store);
				contents = XmlFormatter.format(contents, prefs);
				viewer.getDocument().set(contents);
			}
		};
		viewer.getTextWidget().addDisposeListener(e -> {
			preferenceStore.removePropertyChangeListener(propertyChangeListener);
			JFaceResources.getFontRegistry().removeListener(fontChangeListener);
		});
		JFaceResources.getFontRegistry().addListener(fontChangeListener);
		preferenceStore.addPropertyChangeListener(propertyChangeListener);
	}

	/**
	 * Initializes the given viewer's colors.
	 * 
	 * @param viewer
	 *            the viewer to be initialized
	 * @since 2.0
	 */
	protected void initializeViewerColors(ISourceViewer viewer, IPreferenceStore store) {

		StyledText styledText = viewer.getTextWidget();

		// ----------- foreground color --------------------
		Color color = store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT) ? null
				: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND, styledText.getDisplay());
		styledText.setForeground(color);

		if (fForegroundColor != null) {
			fForegroundColor.dispose();
		}

		fForegroundColor = color;

		// ---------- background color ----------------------
		color = store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT) ? null
				: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND, styledText.getDisplay());
		styledText.setBackground(color);

		if (fBackgroundColor != null) {
			fBackgroundColor.dispose();
		}

		fBackgroundColor = color;

		// ----------- selection foreground color --------------------
		color = store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT) ? null
				: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND, styledText.getDisplay());
		styledText.setSelectionForeground(color);

		if (fSelectionForegroundColor != null) {
			fSelectionForegroundColor.dispose();
		}

		fSelectionForegroundColor = color;

		// ---------- selection background color ----------------------
		color = store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT) ? null
				: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND, styledText.getDisplay());
		styledText.setSelectionBackground(color);

		if (fSelectionBackgroundColor != null) {
			fSelectionBackgroundColor.dispose();
		}

		fSelectionBackgroundColor = color;
	}

	/**
	 * Creates a color from the information stored in the given preference store. Returns <code>null</code> if there is no such information available.
	 * 
	 * @param store
	 *            the store to read from
	 * @param key
	 *            the key used for the lookup in the preference store
	 * @param display
	 *            the display used create the color
	 * @return the created color according to the specification in the preference store
	 * @since 2.0
	 */
	private Color createColor(IPreferenceStore store, String key, Display display) {

		RGB rgb = null;

		if (store.contains(key)) {

			if (store.isDefault(key))
				rgb = PreferenceConverter.getDefaultColor(store, key);
			else
				rgb = PreferenceConverter.getColor(store, key);

			if (rgb != null)
				return new Color(display, rgb);
		}

		return null;
	}

	public void dispose() {
		if (fForegroundColor != null) {
			fForegroundColor.dispose();
			fForegroundColor = null;
		}

		if (fBackgroundColor != null) {
			fBackgroundColor.dispose();
			fBackgroundColor = null;
		}

		if (fSelectionForegroundColor != null) {
			fSelectionForegroundColor.dispose();
			fSelectionForegroundColor = null;
		}

		if (fSelectionBackgroundColor != null) {
			fSelectionBackgroundColor.dispose();
			fSelectionBackgroundColor = null;
		}
	}
}
