/*******************************************************************************
 * 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.Iterator;
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;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleSheet;
import org.eclipse.wst.css.core.internal.util.ImportedCollector;
import org.eclipse.wst.css.core.internal.util.SelectorsCollector;


/**
 * 
 */
public class CSSStyleNotifyAdapter implements ICSSStyleNotifier {

	protected java.util.Vector listeners;
	protected final org.eclipse.wst.css.core.internal.provisional.document.ICSSModel model;
	protected boolean recording = false;

	/**
	 * 
	 */
	public CSSStyleNotifyAdapter(ICSSModel model) {
		super();
		this.model = model;
	}

	/**
	 * 
	 */
	public void addStyleListener(ICSSStyleListener listener) {
		if (listener == null)
			return;

		if (listeners == null)
			listeners = new Vector();
		if (!listeners.contains(listener)) {

			// send new selectors event to listener
			ImportedCollector trav = new ImportedCollector();
			trav.apply(model.getDocument());
			Iterator it = trav.getExternals().iterator();
			while (it.hasNext()) {
				ICSSStyleSheet sheet = (ICSSStyleSheet) it.next();
				// collect selectors
				SelectorsCollector selTrav = new SelectorsCollector();
				selTrav.apply(sheet);
				int nSel = selTrav.getSelectors().size();
				ICSSSelector[] added = new ICSSSelector[nSel];
				for (int i = 0; i < nSel; i++)
					added[i] = (ICSSSelector) selTrav.getSelectors().get(i);

				// fire event
				CSSStyleEventDeliverer deliverer = new CSSStyleEventDeliverer();
				deliverer.fireTo(listener, sheet.getModel(), null, added, null/*
																				 * media
																				 * will
																				 * be
																				 * implemented
																				 * in
																				 * the
																				 * future
																				 */);
			}

			// add listener
			listeners.add(listener);
		}
	}

	/**
	 * 
	 */
	public void beginRecording() {
		recording = true;
	}

	/**
	 * 
	 */
	public void endRecording() {
		recording = false;
	}

	/**
	 * 
	 */
	public void fire(ICSSSelector[] removed, ICSSSelector[] added, String media) {
		// send selector changed event
		CSSStyleEventDeliverer deliv = new CSSStyleEventDeliverer();
		deliv.fire(model, removed, added, null);

	}

	/**
	 * 
	 */
	public java.util.List getStyleListeners() {
		return listeners;
	}

	/**
	 */
	public boolean isRecording() {
		return recording;
	}

	/**
	 * 
	 */
	public void removeStyleListener(ICSSStyleListener listener) {
		if (listener == null)
			return;

		if (listeners.contains(listener)) {
			listeners.remove(listener);

			// send old selectors event to listener
			ImportedCollector trav = new ImportedCollector();
			trav.apply(model.getDocument());
			Iterator it = trav.getExternals().iterator();
			while (it.hasNext()) {
				ICSSStyleSheet sheet = (ICSSStyleSheet) it.next();
				// collect selectors
				SelectorsCollector selTrav = new SelectorsCollector();
				selTrav.apply(sheet);
				int nSel = selTrav.getSelectors().size();
				ICSSSelector[] removed = new ICSSSelector[nSel];
				for (int i = 0; i < nSel; i++)
					removed[i] = (ICSSSelector) selTrav.getSelectors().get(i);

				// fire event
				CSSStyleEventDeliverer deliverer = new CSSStyleEventDeliverer();
				deliverer.fireTo(listener, sheet.getModel(), removed, null, null/*
																				 * media
																				 * will
																				 * be
																				 * implemented
																				 * in
																				 * the
																				 * future
																				 */);
			}
		}
	}

	/**
	 * 
	 */
	public void styleChanged(org.eclipse.wst.css.core.internal.provisional.document.ICSSModel srcModel, org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector[] removed, org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector[] added, java.lang.String media) {
	}

	/**
	 * 
	 */
	public void styleUpdate(org.eclipse.wst.css.core.internal.provisional.document.ICSSModel srcModel) {
	}
}