/*******************************************************************************
 * Copyright (c) 2004 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.wst.css.core.internal.eventimpl;



import java.util.Vector;

import org.eclipse.wst.css.core.internal.event.ICSSStyleListener;
import org.eclipse.wst.css.core.internal.event.ICSSStyleNotifier;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector;


/**
 * 
 */
public class CSSStyleEventDeliverer {

	private Vector fVisited = new Vector();
	private ICSSModel fSrcModel;
	private ICSSSelector[] fRemoved;
	private ICSSSelector[] fAdded;
	private String fMedia;

	/**
	 * 
	 */
	public CSSStyleEventDeliverer() {
		super();
	}

	/**
	 * 
	 */
	public void fire(ICSSModel srcModel, ICSSSelector[] removed, ICSSSelector[] added, String media) {
		if (srcModel == null || srcModel.getStyleListeners() == null)
			return;

		this.fSrcModel = srcModel;
		this.fRemoved = removed;
		this.fAdded = added;
		this.fMedia = media;

		// prohibit delivering to srcModel
		fVisited.clear();
		fVisited.add(srcModel);
		Object[] listeners = srcModel.getStyleListeners().toArray();
		for (int i = 0; i < listeners.length; i++) {
			visit((ICSSStyleListener) listeners[i]);
		}
	}

	/**
	 * 
	 */
	public void fireTo(ICSSStyleListener listener, ICSSModel srcModel, ICSSSelector[] removed, ICSSSelector[] added, String media) {
		this.fSrcModel = srcModel;
		this.fRemoved = removed;
		this.fAdded = added;
		this.fMedia = media;

		// prohibit delivering to srcModel
		fVisited.clear();
		// visited.add(srcModel); : because looping problem
		visit(listener);
	}

	/**
	 * 
	 */
	public void fireUpdate(ICSSModel srcModel) {
		if (srcModel == null || srcModel.getStyleListeners() == null)
			return;

		this.fSrcModel = srcModel;

		// prohibit delivering to srcModel
		fVisited.clear();
		fVisited.add(srcModel);
		Object[] listeners = srcModel.getStyleListeners().toArray();
		for (int i = 0; i < listeners.length; i++) {
			visitUpdate((ICSSStyleListener) listeners[i]);
		}
	}

	/**
	 * 
	 */
	public void fireUpdateTo(ICSSStyleListener listener, ICSSModel srcModel) {
		if (srcModel == null || srcModel.getStyleListeners() == null)
			return;

		this.fSrcModel = srcModel;

		// prohibit delivering to srcModel
		fVisited.clear();
		// visited.add(srcModel);
		visitUpdate(listener);
	}

	/**
	 * 
	 */
	protected void visit(ICSSStyleListener listener) {
		if (listener == null || fVisited.contains(listener))
			return;

		// fire event to listener
		listener.styleChanged(fSrcModel, fRemoved, fAdded, fMedia);
		fVisited.add(listener);

		// traverse notifier
		if (listener instanceof ICSSStyleNotifier) {
			ICSSStyleNotifier notifier = (ICSSStyleNotifier) listener;
			if (notifier.getStyleListeners() != null) {
				Object[] listeners = notifier.getStyleListeners().toArray();
				for (int i = 0; i < listeners.length; i++) {
					visit((ICSSStyleListener) listeners[i]);
				}
			}
		}
	}

	/**
	 * 
	 */
	protected void visitUpdate(ICSSStyleListener listener) {
		if (listener == null || fVisited.contains(listener))
			return;

		// fire event to listener
		listener.styleUpdate(fSrcModel);
		fVisited.add(listener);

		// traverse notifier
		if (listener instanceof ICSSStyleNotifier) {
			ICSSStyleNotifier notifier = (ICSSStyleNotifier) listener;
			if (notifier.getStyleListeners() != null) {
				Object[] listeners = notifier.getStyleListeners().toArray();
				for (int i = 0; i < listeners.length; i++) {
					visitUpdate((ICSSStyleListener) listeners[i]);
				}
			}
		}
	}
}