/*=============================================================================#
 # Copyright (c) 2000, 2021 IBM Corporation and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0
 # 
 # Contributors:
 #     IBM Corporation - org.eclipse.jdt: initial API and implementation
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

// org.eclipse.jdt.internal.ui.preferences.JavaSourcePreviewerUpdater

package org.eclipse.statet.ecommons.text.ui;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Font;

import org.eclipse.statet.ecommons.ui.util.UIAccess;


/**
 * Handles editor font and properties changes for source viewers.
 * <p>
 * It disposes itself automatically.</p>
 */
public class TextViewerJFaceUpdater {
	
	
	protected final ISourceViewer fViewer;
	protected final IPreferenceStore fPreferenceStore;
	
	private IPropertyChangeListener fFontChangeListener;
	
	private final String fSymbolicFontName;
	
	
	/**
	 * Creates a source preview updater for the given viewer and preference store.
	 * 
	 * @param viewer the viewer
	 * @param preferenceStore the preference store
	 */
	public TextViewerJFaceUpdater(final ISourceViewer viewer, final IPreferenceStore preferenceStore) {
		this(viewer, preferenceStore, JFaceResources.TEXT_FONT);
	}
	
	public TextViewerJFaceUpdater(final ISourceViewer viewer, final IPreferenceStore preferenceStore,
			final String symbolicFontName) {
		assert (viewer != null);
		assert (preferenceStore != null);
		assert (symbolicFontName != null);
		
		this.fViewer= viewer;
		this.fPreferenceStore= preferenceStore;
		
		this.fSymbolicFontName= symbolicFontName;
		
		viewer.getTextWidget().addDisposeListener(new DisposeListener() {
			@Override
			public void widgetDisposed(final DisposeEvent e) {
				dispose();
			}
		});
		
		this.fFontChangeListener= new IPropertyChangeListener() {
			@Override
			public void propertyChange(final PropertyChangeEvent event) {
				if (TextViewerJFaceUpdater.this.fSymbolicFontName.equals(event.getProperty())) {
					updateFont();
				}
			}
		};
		JFaceResources.getFontRegistry().addListener(this.fFontChangeListener);
		
		updateFont();
	}
	
	
	protected void updateFont() {
		final Font font= JFaceResources.getFont(this.fSymbolicFontName);
		final StyledText styledText= this.fViewer.getTextWidget();
		if (UIAccess.isOkToUse(styledText) && font != null) {
			this.fViewer.getTextWidget().setFont(font);
		}
	}
	
	
	public final void dispose() {
		if (this.fFontChangeListener != null) {
			JFaceResources.getFontRegistry().removeListener(this.fFontChangeListener);
		}
		this.fFontChangeListener= null;
	}
	
}
