/******************************************************************************* * Copyright (c) 2000, 2008 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.che.ide.api.editor.annotation; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.che.ide.api.editor.text.Position; import org.eclipse.che.ide.api.editor.text.annotation.Annotation; import org.eclipse.che.ide.util.loging.Log; import com.google.gwt.event.shared.GwtEvent; /** * Specification of changes applied to annotation models. The event carries the changed annotation model as well as added, removed, and * modified annotations. * <p/> * An event can be sealed. Afterwards it can not be modified. Thus, the normal process is that an empty event is created, filled with the * changed information, and before it is sent to the listeners, the event is sealed. */ public class AnnotationModelEvent extends GwtEvent<AnnotationModelHandler> { public static final Type<AnnotationModelHandler> TYPE = new Type<>(); /** The model this event refers to. */ private final AnnotationModel annotationModel; /** The added annotations. */ private final Set<Annotation> addedAnnotations = new HashSet<Annotation>(); /** The removed annotations. */ private final Map<Annotation, Position> removedAnnotations = new HashMap<Annotation, Position>(); /** The changed annotations. */ private final Set<Annotation> changedAnnotations = new HashSet<Annotation>(); /** * Creates a new annotation model event for the given model. * * @param model the model */ public AnnotationModelEvent(AnnotationModel model) { this.annotationModel = model; } /** * Returns the model this event refers to. * * @return the model this events belongs to */ public AnnotationModel getAnnotationModel() { return annotationModel; } /** * Adds the given annotation to the set of annotations that are reported as being added from the model. If this event is considered a * world change, it is no longer so after this method has successfully finished. * * @param annotation the added annotation */ public void annotationAdded(Annotation annotation) { addedAnnotations.add(annotation); } /** * Returns the added annotations. * * @return the added annotations */ public List<Annotation> getAddedAnnotations() { return new ArrayList<>(addedAnnotations); } /** * Adds the given annotation to the set of annotations that are reported as being removed from the model. If this event is considered a * world change, it is no longer so after this method has successfully finished. * * @param annotation the removed annotation */ public void annotationRemoved(Annotation annotation) { annotationRemoved(annotation, null); } /** * Adds the given annotation to the set of annotations that are reported as being removed from the model. If this event is considered a * world change, it is no longer so after this method has successfully finished. * * @param annotation the removed annotation * @param position the position of the removed annotation */ public void annotationRemoved(Annotation annotation, Position position) { removedAnnotations.put(annotation, position); } /** * Returns the removed annotations. * * @return the removed annotations */ public List<Annotation> getRemovedAnnotations() { return new ArrayList<>(removedAnnotations.keySet()); } /** * Returns the position of the removed annotation at that point in time when the annotation has been removed. * * @param annotation the removed annotation * @return the position of the removed annotation or <code>null</code> */ public Position getPositionOfRemovedAnnotation(Annotation annotation) { return removedAnnotations.get(annotation); } /** * Adds the given annotation to the set of annotations that are reported as being changed from the model. If this event is considered a * world change, it is no longer so after this method has successfully finished. * * @param annotation the changed annotation */ public void annotationChanged(Annotation annotation) { changedAnnotations.add(annotation); } /** * Returns the changed annotations. * * @return the changed annotations */ public List<Annotation> getChangedAnnotations() { return new ArrayList<>(this.changedAnnotations); } /** * Returns whether this annotation model event is empty or not. If this event represents a world change, this method returns * <code>false</code> although the event does not carry any added, removed, or changed annotations. * * @return <code>true</code> if this event is empty */ public boolean isEmpty() { final boolean result = addedAnnotations.isEmpty() && removedAnnotations.isEmpty() && changedAnnotations.isEmpty(); Log.debug(getClass(), "result", result); return result; } @Override public Type<AnnotationModelHandler> getAssociatedType() { return TYPE; } @Override protected void dispatch(final AnnotationModelHandler handler) { handler.onAnnotationModel(this); } }