package sk.stuba.fiit.perconik.eclipse.core.commands;
import java.util.Collection;
import java.util.Map;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Maps.newLinkedHashMap;
public abstract class ActivatableHandler extends AbstractHandler {
private final Map<String, IHandlerActivation> activations;
protected ActivatableHandler() {
this.activations = newLinkedHashMap();
}
public final IHandlerActivation activate(final String identifier) {
return activate(identifier, Handlers.getHandlerService());
}
public final IHandlerActivation activate(final String identifier, final IHandlerService service) {
checkNotNull(service);
synchronized (this.activations) {
return this.activateInternal(identifier, service);
}
}
private final IHandlerActivation activateInternal(final String identifier, final IHandlerService service) {
checkState(!this.activations.containsKey(identifier));
IHandlerActivation activation = service.activateHandler(identifier, this);
this.activations.put(identifier, activation);
return activation;
}
public final void deactivate() {
synchronized (this.activations) {
for (String identifier: this.activations.keySet()) {
this.deactivateInternal(identifier);
}
}
}
public final void deactivate(final String identifier) {
synchronized (this.activations) {
this.deactivateInternal(identifier);
}
}
private final void deactivateInternal(final String identifier) {
IHandlerActivation activation = this.activations.get(identifier);
checkState(identifier != null);
IHandlerService service = activation.getHandlerService();
if (service != null) {
service.deactivateHandler(activation);
}
}
public final Collection<IHandlerActivation> getActivations() {
return newArrayList(this.activations.values());
}
}