blob: 432b9dbfdc0f078bac6e6cd39246c7c551a75f85 [file] [log] [blame]
/*******************************************************************************
* 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]);
}
}
}
}
}