/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.api.editor.annotation; import java.util.Map; import org.eclipse.che.commons.annotation.Nullable; import org.eclipse.che.ide.api.editor.text.Position; import org.eclipse.che.ide.api.editor.text.annotation.Annotation; import org.eclipse.che.ide.api.editor.text.LinearRange; import com.google.gwt.event.shared.GwtEvent; /** * Event triggered when the annotation model is cleared. */ public class QueryAnnotationsEvent extends GwtEvent<QueryAnnotationsHandler> { /** The type instance of the event. */ public static final Type<QueryAnnotationsHandler> TYPE = new Type<>(); /** Default filter, that accepts any annotation. */ public static final AnnotationFilter YES_FILTER = new AnnotationFilter() { @Override public boolean accept(final Annotation annotation) { return true; } }; /** The callback to call with the result. */ private final QueryCallback callback; /** An optional additional filter. */ private final AnnotationFilter additionalFilter; /** The text range for the query. */ private final LinearRange range; /** * Creates a new annotation model event for the given model. * * @param model the model * @param callback the callback to give the results * @param an additional filter to choose the annotations */ private QueryAnnotationsEvent(final LinearRange range, final QueryCallback callback, final AnnotationFilter additionalFilter) { this.callback = callback; this.range = range; this.additionalFilter = additionalFilter; } @Override public Type<QueryAnnotationsHandler> getAssociatedType() { return TYPE; } @Override protected void dispatch(final QueryAnnotationsHandler handler) { handler.onQueryAnnotations(this); } /** * Returns the callback used to anwser the query. * @return the callback */ public QueryCallback getCallback() { return callback; } /** * Return the range of the query. * @return the range */ public LinearRange getRange() { return range; } /** * Returns the annotation filter. * @return the filter. <em>May be null</em> */ @Nullable public AnnotationFilter getAdditionalFilter() { return additionalFilter; } /** A callback interface used to answer the query. */ public interface QueryCallback { /** The callback method. */ void respond(Map<Annotation, Position> annotations); } /** A filter for annotations in the query result. */ public interface AnnotationFilter { /** * Whether the annotation will be handed. * @param annotation the annotation to examine * @return true accepts the annotation, false rejects it */ boolean accept(Annotation annotation); } /** Builder for {@link QueryAnnotationsEvent} instances.*/ public final static class Builder { /** The range for the query. */ private LinearRange range; /** The callback for the query. */ private QueryCallback callback; /** The filter for the query. */ private AnnotationFilter filter = YES_FILTER; /** * Sets the range. * @param range the range * @return this object */ public Builder withRange(final LinearRange range) { this.range = range; return this; } /** * Sets the cllback. * @param callback the callback * @return this object */ public Builder withCallback(final QueryCallback callback) { this.callback = callback; return this; } /** * Sets the filter. * @param filter the filter * @return this object */ public Builder withFilter(AnnotationFilter filter) { this.filter = filter; return this; } /** * Builds the {@link QueryAnnotationsEvent}. * @return the created instance */ public QueryAnnotationsEvent build() { return new QueryAnnotationsEvent(this.range, this.callback, this.filter); } } }