blob: e0419847bea4746b6919f926d597a08a359015b9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2014 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.e4.ui.bindings.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.commands.contexts.Context;
import org.eclipse.core.commands.contexts.ContextManager;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.ui.bindings.EBindingService;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.jface.bindings.Binding;
import org.eclipse.jface.bindings.TriggerSequence;
import org.eclipse.jface.bindings.keys.KeyBinding;
import org.eclipse.jface.bindings.keys.KeySequence;
import org.eclipse.jface.bindings.keys.ParseException;
/**
*
*/
public class BindingServiceImpl implements EBindingService {
static final String USER_TYPE = "user"; //$NON-NLS-1$
@Inject
private IEclipseContext context;
@Inject
private BindingTableManager manager;
@Inject
private ContextManager contextManager;
private ContextSet contextSet = ContextSet.EMPTY;
@Override
public Binding createBinding(TriggerSequence sequence, ParameterizedCommand command,
String contextId, Map<String, String> attributes) {
String schemeId = DEFAULT_SCHEME_ID;
String locale = null;
String platform = null;
int bindingType = Binding.SYSTEM;
if (sequence != null && !sequence.isEmpty() && contextId != null) {
if (attributes != null) {
String tmp = attributes.get(SCHEME_ID_ATTR_TAG);
if (tmp != null && tmp.length() > 0) {
schemeId = tmp;
}
locale = attributes.get(LOCALE_ATTR_TAG);
platform = attributes.get(PLATFORM_ATTR_TAG);
if (USER_TYPE.equals(attributes.get(TYPE_ATTR_TAG))) {
bindingType = Binding.USER;
}
}
return new KeyBinding((KeySequence) sequence, command, schemeId, contextId, locale,
platform, null, bindingType);
}
return null;
}
@Override
public void activateBinding(Binding binding) {
String contextId = binding.getContextId();
BindingTable table = manager.getTable(contextId);
if (table == null) {
return;
}
table.addBinding(binding);
}
@Override
public void deactivateBinding(Binding binding) {
String contextId = binding.getContextId();
BindingTable table = manager.getTable(contextId);
if (table == null) {
//System.err.println("No binding table for " + contextId); //$NON-NLS-1$
return;
}
table.removeBinding(binding);
}
@Override
public TriggerSequence createSequence(String sequence) {
try {
return KeySequence.getInstance(sequence);
} catch (ParseException e) {
// should probably log
}
return null;
}
@Override
public Collection<Binding> getConflictsFor(TriggerSequence sequence) {
return manager.getConflictsFor(contextSet, sequence);
}
@Override
public Collection<Binding> getAllConflicts() {
return manager.getAllConflicts();
}
@Override
public Binding getPerfectMatch(TriggerSequence trigger) {
return manager.getPerfectMatch(contextSet, trigger);
}
@Override
public boolean isPartialMatch(TriggerSequence keySequence) {
return manager.isPartialMatch(contextSet, keySequence);
}
@Override
public TriggerSequence getBestSequenceFor(ParameterizedCommand command) {
Binding binding = manager.getBestSequenceFor(contextSet, command);
return binding == null ? null : binding.getTriggerSequence();
}
@Override
public Collection<TriggerSequence> getSequencesFor(ParameterizedCommand command) {
Collection<Binding> bindings = manager.getSequencesFor(contextSet, command);
ArrayList<TriggerSequence> sequences = new ArrayList<>(bindings.size());
for (Binding binding : bindings) {
sequences.add(binding.getTriggerSequence());
}
return sequences;
}
@Override
public Collection<Binding> getBindingsFor(ParameterizedCommand command) {
return manager.getBindingsFor(contextSet, command);
}
@Override
public boolean isPerfectMatch(TriggerSequence sequence) {
return getPerfectMatch(sequence) != null;
}
@Override
public Collection<Binding> getPartialMatches(TriggerSequence sequence) {
return manager.getPartialMatches(contextSet, sequence);
}
/**
* @return the context for this service.
*/
public IEclipseContext getContext() {
return context;
}
@Inject
private void setContextIds(@Named(IServiceConstants.ACTIVE_CONTEXTS) @Optional Set<String> set) {
if (set == null || set.isEmpty() || contextManager == null) {
contextSet = ContextSet.EMPTY;
return;
}
Set<Context> contexts = new HashSet<>();
for (String id : set) {
while (id != null) {
Context context = contextManager.getContext(id);
if (!contexts.add(context) || !context.isDefined()) {
// Parent is already added or is not defined
break;
}
try {
id = context.getParentId();
} catch (NotDefinedException e) {
// This should never happen
}
}
}
contextSet = manager.createContextSet(contexts);
}
@Override
public Collection<Binding> getActiveBindings() {
return manager.getActiveBindings();
}
}