| /******************************************************************************* |
| * Copyright (c) 2004, 2005 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]); |
| } |
| } |
| } |
| } |
| } |