package sk.stuba.fiit.perconik.activity.listeners.search; import org.eclipse.search.ui.SearchResultEvent; import org.eclipse.search.ui.text.FilterUpdateEvent; import org.eclipse.search.ui.text.MatchEvent; import org.eclipse.search.ui.text.RemoveAllEvent; import sk.stuba.fiit.perconik.activity.events.LocalEvent; import sk.stuba.fiit.perconik.activity.listeners.ActivityListener; import sk.stuba.fiit.perconik.activity.serializers.ObjectIdentitySerializer; import sk.stuba.fiit.perconik.activity.serializers.search.SearchResultSerializer; import sk.stuba.fiit.perconik.core.annotations.Version; import sk.stuba.fiit.perconik.data.content.StructuredContent; import sk.stuba.fiit.perconik.data.events.Event; import sk.stuba.fiit.perconik.eclipse.search.ui.text.MatchEventKind; import static sk.stuba.fiit.perconik.activity.listeners.search.SearchResultListener.Action.ADD; import static sk.stuba.fiit.perconik.activity.listeners.search.SearchResultListener.Action.FILTER; import static sk.stuba.fiit.perconik.activity.listeners.search.SearchResultListener.Action.REMOVE; import static sk.stuba.fiit.perconik.activity.listeners.search.SearchResultListener.Action.REMOVE_ALL; import static sk.stuba.fiit.perconik.activity.serializers.ConfigurableSerializer.StandardOption.TREE; import static sk.stuba.fiit.perconik.activity.serializers.Serializations.identifyObject; import static sk.stuba.fiit.perconik.data.content.StructuredContents.key; /** * TODO * * @author Pavol Zbell * @since 1.0 */ @Version("0.0.4.alpha") public final class SearchResultListener extends ActivityListener implements sk.stuba.fiit.perconik.core.listeners.SearchResultListener { public SearchResultListener() {} enum Action implements ActivityListener.Action { ADD, REMOVE, REMOVE_ALL, FILTER; private final String name; private final String path; private Action() { this.name = actionName("eclipse", "search", "result", this); this.path = actionPath(this.name); } public String getName() { return this.name; } public String getPath() { return this.path; } } private static void putEvent(final StructuredContent content, final SearchResultEvent event) { content.put(key("source"), identifyObject(event.getSource())); content.put(key("result"), new SearchResultSerializer(TREE).serialize(event.getSearchResult())); } static Event build(final long time, final Action action, final MatchEvent event) { Event data = LocalEvent.of(time, action.getName()); putEvent(data, event); data.put(key("matches"), new ObjectIdentitySerializer().serialize(event.getMatches())); return data; } static Event build(final long time, final Action action, final FilterUpdateEvent event) { Event data = LocalEvent.of(time, action.getName()); putEvent(data, event); data.put(key("filters", "active"), new ObjectIdentitySerializer().serialize(event.getActiveFilters())); data.put(key("matches", "updated"), new ObjectIdentitySerializer().serialize(event.getUpdatedMatches())); return data; } static Event build(final long time, final Action action, final RemoveAllEvent event) { Event data = LocalEvent.of(time, action.getName()); putEvent(data, event); return data; } void process(final long time, final SearchResultEvent event) { if (event instanceof MatchEvent) { Action action; switch (MatchEventKind.valueOf(((MatchEvent) event).getKind())) { case ADDED: action = ADD; break; case REMOVED: action = REMOVE; break; default: return; } this.send(action.getPath(), build(time, action, (MatchEvent) event)); } else if (event instanceof FilterUpdateEvent) { this.send(FILTER.getPath(), build(time, FILTER, (FilterUpdateEvent) event)); } else if (event instanceof RemoveAllEvent) { this.send(REMOVE_ALL.getPath(), build(time, REMOVE_ALL, (RemoveAllEvent) event)); } } void execute(final long time, final SearchResultEvent event) { this.execute(new Runnable() { public void run() { process(time, event); } }); } public void searchResultChanged(final SearchResultEvent event) { long time = currentTime(); this.execute(time, event); } }