/**
* Copyright (c) 2007 Borland Software Corporation
*
* 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:
* bblajer - initial API and implementation
*/
package org.eclipse.gmf.runtime.lite.edit.parts.update;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EStructuralFeature;
/**
* Registry that allows registering and unregistering refreshers. Refreshers are classified primarily based on
* structural features they are registered for (because this seems to be the most typical case), but further filtering is supported.
* @see IUpdatableEditPart.Refresher
*/
public class RefreshersRegistry {
private HashMap<EStructuralFeature, CompositeConditionalRefresher> myFeature2Refreshers;
public void add(EStructuralFeature feature, IUpdatableEditPart.Refresher refresher) {
if (refresher == null) {
return;
}
get(feature, true).add(refresher);
}
public void remove(EStructuralFeature feature, IUpdatableEditPart.Refresher refresher) {
if (refresher == null) {
return;
}
CompositeConditionalRefresher compositeRefresher = get(feature, false);
if (compositeRefresher == null) {
return;
}
compositeRefresher.remove(refresher);
}
private CompositeConditionalRefresher get(EStructuralFeature feature, boolean createIfMissing) {
if (myFeature2Refreshers == null) {
if (!createIfMissing) {
return null;
}
myFeature2Refreshers = new HashMap<EStructuralFeature, CompositeConditionalRefresher>();
}
CompositeConditionalRefresher result = myFeature2Refreshers.get(feature);
if (result == null) {
if (createIfMissing) {
result = new CompositeConditionalRefresher();
myFeature2Refreshers.put(feature, result);
}
}
return result;
}
public IUpdatableEditPart.Refresher getRefresher(EStructuralFeature feature, Notification msg) {
CompositeConditionalRefresher compositeRefresher = get(feature, false);
if (compositeRefresher == null) {
return null;
}
return compositeRefresher.getFiltered(msg);
}
private static class CompositeConditionalRefresher {
private Collection<IUpdatableEditPart.Refresher> myRefreshers;
public void add(IUpdatableEditPart.Refresher refresher) {
if (refresher == null) {
return;
}
if (myRefreshers == null) {
myRefreshers = new LinkedList<IUpdatableEditPart.Refresher>();
}
myRefreshers.add(refresher);
}
public void remove(IUpdatableEditPart.Refresher refresher) {
if (refresher == null || myRefreshers == null) {
return;
}
myRefreshers.remove(refresher);
}
public IUpdatableEditPart.Refresher getFiltered(Notification msg) {
if (myRefreshers == null) {
return null;
}
Collection<IUpdatableEditPart.Refresher> result = new HashSet<IUpdatableEditPart.Refresher>();
for(IUpdatableEditPart.Refresher next : myRefreshers) {
if (isAffecting(next, msg)) {
result.add(next);
}
}
return new ComposeableRefresherImpl(result);
}
private boolean isAffecting(IUpdatableEditPart.Refresher refresher, Notification msg) {
if (refresher instanceof IExternallyUpdatableEditPart.ExternalRefresher) {
return ((IExternallyUpdatableEditPart.ExternalRefresher) refresher).isAffectingEvent(msg);
}
return true;
}
public void refresh() {
if (myRefreshers == null) {
return;
}
for (IUpdatableEditPart.Refresher next : myRefreshers) {
next.refresh();
}
}
}
}