/*******************************************************************************
 * Copyright (c) 2006, 2011 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.compare.internal;

import org.eclipse.compare.IContentChangeListener;
import org.eclipse.compare.IContentChangeNotifier;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.swt.widgets.Display;

/**
 * A helper class for managing content change notification.
 */
public class ContentChangeNotifier implements IContentChangeNotifier {

	private ListenerList fListenerList;
	private final IContentChangeNotifier element;

	public ContentChangeNotifier(IContentChangeNotifier element) {
		this.element = element;
	}

	/* (non-Javadoc)
	 * see IContentChangeNotifier.addChangeListener
	 */
	public void addContentChangeListener(IContentChangeListener listener) {
		if (fListenerList == null)
			fListenerList= new ListenerList();
		fListenerList.add(listener);
	}

	/* (non-Javadoc)
	 * see IContentChangeNotifier.removeChangeListener
	 */
	public void removeContentChangeListener(IContentChangeListener listener) {
		if (fListenerList != null) {
			fListenerList.remove(listener);
			if (fListenerList.isEmpty())
				fListenerList= null;
		}
	}

	/**
	 * Notifies all registered <code>IContentChangeListener</code>s of a content change.
	 */
	public void fireContentChanged() {
		if (isEmpty()) {
			return;
		}
		// Legacy listeners may expect to be notified in the UI thread.
		Runnable runnable = new Runnable() {
			public void run() {
				Object[] listeners= fListenerList.getListeners();
				for (int i= 0; i < listeners.length; i++) {
					final IContentChangeListener contentChangeListener = (IContentChangeListener)listeners[i];
					SafeRunner.run(new ISafeRunnable() {
						public void run() throws Exception {
							contentChangeListener.contentChanged(element);
						}
						public void handleException(Throwable exception) {
							// Logged by safe runner
						}
					});
				}
			}
		};
		if (Display.getCurrent() == null) {
			Display.getDefault().syncExec(runnable);
		} else {
			runnable.run();
		}
	}

	/**
	 * Return whether this notifier is empty (i.e. has no listeners).
	 * @return whether this notifier is empty
	 */
	public boolean isEmpty() {
		return fListenerList == null || fListenerList.isEmpty();
	}

}
