Bug 335985 - Adapt the KeyController model to the e4 model
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/BindingToModelProcessor.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/BindingToModelProcessor.java
index 3e5fa44..d587832 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/BindingToModelProcessor.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/BindingToModelProcessor.java
@@ -11,15 +11,15 @@
package org.eclipse.ui.internal;
+import java.util.Collection;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.commands.CommandManager;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.contexts.ContextManager;
import org.eclipse.e4.core.di.annotations.Execute;
-import org.eclipse.e4.ui.bindings.internal.BindingCopies;
+import org.eclipse.e4.ui.bindings.EBindingService;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.commands.MBindingContext;
import org.eclipse.e4.ui.model.application.commands.MBindingTable;
@@ -44,8 +44,6 @@
private Map<String, MCommand> commands = new HashMap<String, MCommand>();
private Map<String, MBindingTable> tables = new HashMap<String, MBindingTable>();
-
-
@Execute
void process(final MApplication application) {
gatherContexts(application.getRootContext());
@@ -61,11 +59,19 @@
BindingManager bindingManager = new BindingManager(contextManager, commandManager);
BindingPersistence persistence = new BindingPersistence(bindingManager, commandManager);
persistence.read();
- Iterator i = bindingManager.getActiveBindingsDisregardingContextFlat().iterator();
- while (i.hasNext()) {
- Binding binding = (Binding) i.next();
+
+ // we'll make this available, although I doubt we have a use for it
+ application.getTags().add(
+ EBindingService.ACTIVE_SCHEME_TAG + ':' + bindingManager.getActiveScheme().getId());
+
+ Collection activeBindingsForScheme = bindingManager
+ .getActiveBindingsDisregardingContextFlat();
+
+ for (Object obj : activeBindingsForScheme) {
+ Binding binding = (Binding) obj;
addBinding(application, binding);
}
+
persistence.dispose();
}
@@ -80,14 +86,9 @@
public final void addBinding(final MApplication application, final Binding binding) {
- if (binding.getType() == Binding.USER) {
- BindingCopies.addUserBinding(binding);
- }
-
MBindingTable table = tables.get(binding.getContextId());
if (table == null) {
table = createTable(application, binding.getContextId());
-
}
final MKeyBinding keyBinding = CommandsFactoryImpl.eINSTANCE.createKeyBinding();
ParameterizedCommand parmCmd = binding.getParameterizedCommand();
@@ -106,6 +107,27 @@
p.setValue((String) entry.getValue());
keyBinding.getParameters().add(p);
}
+
+ List<String> tags = keyBinding.getTags();
+ // just add the 'schemeId' tag if it's anything other than the default
+ // scheme id
+ if (binding.getSchemeId() != null
+ && !binding.getSchemeId().equals(
+ org.eclipse.ui.keys.IBindingService.DEFAULT_DEFAULT_ACTIVE_SCHEME_ID)) {
+ tags.add(EBindingService.SCHEME_ID_ATTR_TAG + ":" + binding.getSchemeId()); //$NON-NLS-1$
+ }
+ if (binding.getLocale() != null) {
+ tags.add(EBindingService.LOCALE_ATTR_TAG + ":" + binding.getLocale()); //$NON-NLS-1$
+ }
+ if (binding.getPlatform() != null) {
+ tags.add(EBindingService.PLATFORM_ATTR_TAG + ":" + binding.getPlatform()); //$NON-NLS-1$
+ }
+ // just add the 'type' tag if it's a user binding
+ if (binding.getType() == Binding.USER) {
+ tags.add(EBindingService.TYPE_ATTR_TAG + ":user"); //$NON-NLS-1$
+ }
+
+ keyBinding.getTransientData().put(EBindingService.MODEL_TO_BINDING_KEY, binding);
table.getBindings().add(keyBinding);
}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/BindingPersistence.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/BindingPersistence.java
index 64475e7..149bf65 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/BindingPersistence.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/BindingPersistence.java
@@ -35,7 +35,6 @@
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IRegistryChangeEvent;
import org.eclipse.core.runtime.Platform;
-import org.eclipse.e4.ui.bindings.internal.BindingCopies;
import org.eclipse.jface.bindings.Binding;
import org.eclipse.jface.bindings.BindingManager;
import org.eclipse.jface.bindings.Scheme;
@@ -481,10 +480,6 @@
final BindingManager bindingManager, final CommandManager commandService) {
List warningsToLog = new ArrayList(1);
- // flag to deactivate a SYSTEM binding
- boolean flagDeactivate = false;
- int bindingType = Binding.USER;
-
if (preferences != null) {
final IMemento[] preferenceMementos = preferences
.getChildren(TAG_KEY_BINDING);
@@ -580,42 +575,13 @@
warningsToLog, command);
}
- // see if this is actually a USER binding or a default SYSTEM
- // binding that the user deactivated
- String isDeactivatedSystemBinding = readOptional(memento, ATT_DELETED);
- if (isDeactivatedSystemBinding != null && isDeactivatedSystemBinding.equals("true")) { //$NON-NLS-1$
- flagDeactivate = true;
- }
-
- if (flagDeactivate) {
- bindingType = Binding.SYSTEM;
- } else {
- bindingType = Binding.USER;
- }
-
final Binding binding = new KeyBinding(keySequence,
- parameterizedCommand, schemeId, contextId, locale, platform, null, bindingType);
-
- if (flagDeactivate) {
- BindingCopies.addInactiveSysBinding(binding);
- } else {
- bindingManager.addBinding(binding);
- }
-
- // reset flag
- flagDeactivate = false;
+ parameterizedCommand, schemeId, contextId, locale,
+ platform, null, Binding.USER);
+ bindingManager.addBinding(binding);
}
}
- Binding[] sysBindingsToRemove = BindingCopies.getInactiveSysBindings();
- for (int i = 0; i < sysBindingsToRemove.length; i++) {
- // bindingManager.removeBinding(sysBindingsToRemove[i]);
- bindingManager.removeBindings(sysBindingsToRemove[i].getTriggerSequence(),
- sysBindingsToRemove[i].getSchemeId(), sysBindingsToRemove[i].getContextId(),
- sysBindingsToRemove[i].getLocale(), sysBindingsToRemove[i].getPlatform(), null,
- sysBindingsToRemove[i].getType());
- }
-
// If there were any warnings, then log them now.
logWarnings(warningsToLog,
"Warnings while parsing the key bindings from the preference store"); //$NON-NLS-1$
@@ -1097,15 +1063,14 @@
*
* @param activeScheme
* The scheme which should be persisted; may be <code>null</code>.
- * @param activeUserBindings
+ * @param bindings
* The bindings which should be persisted; may be
* <code>null</code>
* @throws IOException
* If something happens while trying to write to the workbench
* preference store.
*/
- static final void write(final Scheme activeScheme, final Binding[] activeUserBindings,
- Binding[] inactiveSystemBindings)
+ static final void write(final Scheme activeScheme, final Binding[] bindings)
throws IOException {
// Print out debugging information, if requested.
if (DEBUG) {
@@ -1123,23 +1088,12 @@
if (activeScheme != null) {
writeActiveSchemeToPreferences(xmlMemento, activeScheme);
}
- // write all active USER Bindings
- if (activeUserBindings != null) {
- final int bindingsLength = activeUserBindings.length;
+ if (bindings != null) {
+ final int bindingsLength = bindings.length;
for (int i = 0; i < bindingsLength; i++) {
- final Binding binding = activeUserBindings[i];
- if (binding.getParameterizedCommand() != null && binding.getType() == Binding.USER) {
- writeBindingToPreferences(xmlMemento, binding, false);
- }
- }
- }
- // write all deactivated SYSTEM bindings so that we know which default
- // bindings to disable on the next startup
- if (inactiveSystemBindings != null) {
- for (int i = 0; i < inactiveSystemBindings.length; i++) {
- final Binding inactiveSystemBinding = inactiveSystemBindings[i];
- if (inactiveSystemBinding.getType() == Binding.SYSTEM) {
- writeBindingToPreferences(xmlMemento, inactiveSystemBinding, true);
+ final Binding binding = bindings[i];
+ if (binding.getType() == Binding.USER) {
+ writeBindingToPreferences(xmlMemento, binding);
}
}
}
@@ -1216,7 +1170,7 @@
* The binding to write; must not be <code>null</code>.
*/
private static final void writeBindingToPreferences(final IMemento parent,
- final Binding binding, boolean inactiveSystemBinding) {
+ final Binding binding) {
final IMemento element = parent.createChild(TAG_KEY_BINDING);
element.putString(ATT_CONTEXT_ID, binding.getContextId());
final ParameterizedCommand parameterizedCommand = binding
@@ -1229,11 +1183,6 @@
.toString());
element.putString(ATT_LOCALE, binding.getLocale());
element.putString(ATT_PLATFORM, binding.getPlatform());
- if (inactiveSystemBinding) {
- element.putString(ATT_DELETED, "true"); //$NON-NLS-1$
- } else {
- element.putString(ATT_DELETED, "false"); //$NON-NLS-1$
- }
if (parameterizedCommand != null) {
final Map parameterizations = parameterizedCommand
.getParameterMap();
@@ -1277,7 +1226,6 @@
final CommandManager commandManager) {
this.bindingManager = bindingManager;
this.commandManager = commandManager;
- BindingCopies.init();
}
protected final boolean isChangeImportant(final IRegistryChangeEvent event) {
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/BindingService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/BindingService.java
index 82fb3f0..2b36cc7 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/BindingService.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/BindingService.java
@@ -11,20 +11,20 @@
package org.eclipse.ui.internal.keys;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.eclipse.core.commands.CommandManager;
import org.eclipse.core.commands.ParameterizedCommand;
+import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.e4.core.commands.ECommandService;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.ui.bindings.EBindingService;
-import org.eclipse.e4.ui.bindings.internal.BindingCopies;
-import org.eclipse.e4.ui.bindings.internal.BindingTableManager;
import org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.commands.MBindingContext;
@@ -42,7 +42,7 @@
import org.eclipse.jface.bindings.keys.KeySequence;
import org.eclipse.jface.util.Util;
import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.internal.e4.compatibility.E4Util;
+import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.keys.IBindingService;
/**
@@ -67,15 +67,12 @@
private ECommandService commandService;
@Inject
+ private CommandManager commandManager;
+
+ @Inject
private BindingManager manager;
@Inject
- private CommandManager cmdManager;
-
- @Inject
- private BindingTableManager bindingTableManager;
-
- @Inject
@Optional
private KeyBindingDispatcher dispatcher;
@@ -87,12 +84,7 @@
* @see org.eclipse.ui.services.IDisposable#dispose()
*/
public void dispose() {
- for (Runnable r : bindingsToRemove) {
- r.run();
- }
- for (MBindingTable table : tablesToRemove) {
- application.getBindingTables().remove(table);
- }
+
}
/*
@@ -247,9 +239,9 @@
if (prefixesLength == 0) {
return Collections.EMPTY_MAP;
}
-
+
Collection<Binding> partialMatches = bindingService.getPartialMatches(trigger);
- Map<TriggerSequence,Object> prefixTable = new HashMap<TriggerSequence, Object>();
+ Map<TriggerSequence, Object> prefixTable = new HashMap<TriggerSequence, Object>();
for (Binding binding : partialMatches) {
for (int i = 0; i < prefixesLength; i++) {
final TriggerSequence prefix = prefixes[i];
@@ -332,13 +324,9 @@
* @see org.eclipse.ui.keys.IBindingService#openKeyAssistDialog()
*/
public void openKeyAssistDialog() {
- // TODO compat openKeyAssistDialog
- E4Util.unsupported("openKeyAssistDialog"); //$NON-NLS-1$
+ dispatcher.openMultiKeyAssistShell();
}
- private ArrayList<MBindingTable> tablesToRemove = new ArrayList<MBindingTable>();
- private ArrayList<Runnable> bindingsToRemove = new ArrayList<Runnable>();
-
/*
* (non-Javadoc)
*
@@ -347,27 +335,8 @@
* .ui.commands.ICommandService)
*/
public void readRegistryAndPreferences(ICommandService commandService) {
-
-
- // TODO: shouldn't be using BindingPersistence here, but if we don't,
- // then the keys pref page will crash when loading!
- BindingPersistence bindingPersistence = new BindingPersistence(manager, cmdManager);
- bindingPersistence.reRead();
-
- Collection<Binding> bindings = bindingTableManager.getActiveBindings();
- manager.setBindings(bindings.toArray(new Binding[bindings.size()]));
-
- // BindingPersistence reader = new BindingPersistence(manager,
- // commandService);
- // reader.reRead();
- // Iterator i =
- // manager.getActiveBindingsDisregardingContextFlat().iterator();
- // while (i.hasNext()) {
- // Binding binding = (Binding) i.next();
- // addBinding(binding);
- // }
-
- bindingPersistence.dispose();
+ BindingPersistence bp = new BindingPersistence(manager, commandManager);
+ bp.read();
}
private MCommand findCommand(String id) {
@@ -379,6 +348,17 @@
return null;
}
+ private void saveLegacyPreferences(Scheme activeScheme, Binding[] bindings) throws IOException {
+ BindingPersistence.write(activeScheme, bindings);
+ try {
+ manager.setActiveScheme(activeScheme);
+ } catch (final NotDefinedException e) {
+ WorkbenchPlugin.log("The active scheme is not currently defined.", //$NON-NLS-1$
+ WorkbenchPlugin.getStatus(e));
+ }
+ manager.setBindings(bindings);
+ }
+
/*
* (non-Javadoc)
*
@@ -387,107 +367,74 @@
* .bindings.Scheme, org.eclipse.jface.bindings.Binding[])
*/
public void savePreferences(Scheme activeScheme, Binding[] bindings) throws IOException {
+ saveLegacyPreferences(activeScheme, bindings);
- Collection<Binding> activeBindings = bindingTableManager.getActiveBindings();
- Binding[] activeBindingsArray = activeBindings.toArray(new Binding[activeBindings.size()]);
+ // save the active scheme to the model
+ writeSchemeToModel(activeScheme);
- Binding b;
+ // weeds out any of the deleted system bindings using the binding
+ // manager
+ HashSet<Binding> activeBindings = new HashSet<Binding>(
+ manager.getActiveBindingsDisregardingContextFlat());
- Collection<Binding> activeUserBindings = new ArrayList<Binding>();
-
- boolean madeChanges = false; // flag to actually save the prefs
-
- // go through the list of active bindings (from the BTM) and DEACTIVATE
- // any bindings that are not included in the list of bindings passed
- // from the new keys pref page
- for (int i = 0; i < activeBindingsArray.length; i++) {
- b = getEqualBinding(bindings, activeBindingsArray[i]);
-
- // if we didn't find the binding, then it wasn't included in the
- // list passed from the new keys pref page, so this binding needs to
- // be deactivated
- if (b == null) {
- bindingService.deactivateBinding(activeBindingsArray[i]);
-
- // make sure we keep this binding manager consistent with the
- // BTM since the keys pref page will read off this
- manager.removeBinding(activeBindingsArray[i]);
-
- // if we're deactivating a SYSTEM binding, then keep it in the
- // list of bindings to write to xml, but make sure it gets
- // flagged as disabled
- if (activeBindingsArray[i].getType() == Binding.SYSTEM) {
- // inactiveSystemBindings.add(activeBindingsArray[i]);
- BindingCopies.addInactiveSysBinding(activeBindingsArray[i]);
+ // get all of the (active) model bindings that point to the actual runtime
+ // bindings
+ HashMap<Binding, MKeyBinding> bindingToKey = new HashMap<Binding, MKeyBinding>();
+ for (MBindingTable table : application.getBindingTables()) {
+ for (MKeyBinding modelBinding : table.getBindings()) {
+ final Object obj = modelBinding.getTransientData().get(
+ EBindingService.MODEL_TO_BINDING_KEY);
+ if (obj instanceof Binding) {
+ bindingToKey.put((Binding) obj, modelBinding);
}
-
- // flag that changes were made to the bindings so that we need
- // to save
- madeChanges = true;
}
}
- // go though the list of bindings passed from the new keys pref page and
- // ACTIVATE the NEW bindings added
- for (int i = 0; i < bindings.length; i++) {
- b = getEqualBinding(activeBindingsArray, bindings[i]);
-
- // if we didn't find the binding, that means it's a new one, so
- // let's activate it (as long as the command isn't null)
- if (b == null && bindings[i].getParameterizedCommand() != null) {
-
- bindingService.activateBinding(bindings[i]);
-
- // make sure we keep this binding manager consistent with the
- // BTM since the keys pref page will read off this
- manager.addBinding(bindings[i]);
-
- // flag that changes were made to the bindings, so we need
- // to persist them
- madeChanges = true;
-
- // Since the binding persistence only writes out active USER
- // bindings and deactivated SYSTEM bindings, there's no point in
- // sending the entire bindings list and searching USER bindings.
- if (bindings[i].getType() == Binding.USER) {
- activeUserBindings.add(bindings[i]);
- } else {
- BindingCopies.removeInactiveSysBinding(bindings[i]);
+ // go through each of the (active) bindings in the model to see if there are any
+ // bindings that we should remove
+ final HashSet<Binding> deleted = new HashSet<Binding>(bindingToKey.keySet());
+ deleted.removeAll(activeBindings);
+ for (Binding binding : deleted) {
+ if (binding.getType() == Binding.USER) {
+ removeBinding(binding);
+ } else {
+ final MKeyBinding model = bindingToKey.get(binding);
+ if (!model.getTags().contains(EBindingService.DELETED_BINDING_TAG)) {
+ model.getTags().add(EBindingService.DELETED_BINDING_TAG);
}
-
- // since we've activated a new binding, we need to see if it's
- // replacing one of the old bindings (in which case the old
- // binding needs to be deactivated)
- // ... but not right now
- }
- // else if the binding was already activated AND it's a USER
- // binding, then we'll need to persist it as well
- else if (bindings[i].getType() == Binding.USER) {
- activeUserBindings.add(bindings[i]);
- madeChanges = true;
}
}
-
- // if we made any changes, then they need to be persisted
- if (madeChanges) {
- // BindingPersistence.write(activeScheme, bindings);
- BindingPersistence.write(activeScheme,
- activeUserBindings.toArray(new Binding[activeUserBindings.size()]),
- BindingCopies.getInactiveSysBindings());
- // TODO: these numbers don't make sense... dig a litter deeper
+
+ // go through each of the active bindings (from the binding manager) to
+ // see if there are any bindings that we should add to the runtime
+ for (Binding binding : activeBindings) {
+ final MKeyBinding model = bindingToKey.get(binding);
+ // if we found the binding but it's marked as deleted, then just
+ // remove the deleted tag
+ if (model != null) {
+ if (model.getTags().contains(EBindingService.DELETED_BINDING_TAG)) {
+ model.getTags().remove(EBindingService.DELETED_BINDING_TAG);
+ }
+ } else {
+ addBinding(binding);
+ }
}
-
}
- private Binding getEqualBinding(Binding[] bindings, Binding target) {
- Binding theBinding = null;
- for (int i = 0; i < bindings.length && theBinding == null; i++) {
- if (bindings[i].equals(target)) {
- theBinding = bindings[i];
+ private void writeSchemeToModel(Scheme activeScheme) {
+ List<String> tags = application.getTags();
+ boolean found = false;
+ // replace the old scheme id
+ Iterator<String> i = tags.iterator();
+ while (i.hasNext() && !found) {
+ String tag = i.next();
+ if (tag.startsWith(EBindingService.ACTIVE_SCHEME_TAG)) {
+ i.remove();
+ found = true;
}
}
- return theBinding;
+ tags.add(EBindingService.ACTIVE_SCHEME_TAG + ":" + activeScheme.getId()); //$NON-NLS-1$
}
/*
@@ -508,7 +455,7 @@
* org.eclipse.ui.keys.IBindingService#getConflictsFor(org.eclipse.jface
* .bindings.TriggerSequence)
*/
- public Collection getConflictsFor(TriggerSequence sequence) {
+ public Collection<Binding> getConflictsFor(TriggerSequence sequence) {
return bindingService.getConflictsFor(sequence);
}
@@ -565,29 +512,46 @@
* The binding to be added; must not be <code>null</code>.
*/
public final void addBinding(final Binding binding) {
- MBindingTable table = null;
+ MBindingTable table = getMTable(binding.getContextId());
+ MKeyBinding keyBinding = createMKeyBinding(binding);
+ if (keyBinding != null) {
+ table.getBindings().add(keyBinding);
+ }
+ }
+
+ /**
+ * @param contextId
+ * @return
+ */
+ private MBindingTable getMTable(String contextId) {
for (MBindingTable bt : application.getBindingTables()) {
- if (bt.getBindingContext().getElementId().equals(binding.getContextId())) {
- table = bt;
- break;
+ if (bt.getBindingContext().getElementId().equals(contextId)) {
+ return bt;
}
}
- if (table == null) {
- table = CommandsFactoryImpl.eINSTANCE.createBindingTable();
- tablesToRemove.add(table);
- table.setBindingContext(getBindingContext(binding.getContextId()));
- table.setElementId(binding.getContextId());
- application.getBindingTables().add(table);
- }
+ // create a new table if we couldn't find one
+ MBindingTable table = CommandsFactoryImpl.eINSTANCE.createBindingTable();
+ table.setBindingContext(getBindingContext(contextId));
+ table.setElementId(contextId);
+ application.getBindingTables().add(table);
+ return table;
+
+ }
+
+
+ private MKeyBinding createMKeyBinding(Binding binding) {
final MKeyBinding keyBinding = CommandsFactoryImpl.eINSTANCE.createKeyBinding();
+
ParameterizedCommand parmCmd = binding.getParameterizedCommand();
MCommand cmd = findCommand(parmCmd.getId());
if (cmd == null) {
- return;
+ return null;
}
keyBinding.setCommand(cmd);
+ // keyBinding.setKeySequence(binding.getTriggerSequence().format());
keyBinding.setKeySequence(binding.getTriggerSequence().format());
+
for (Object obj : parmCmd.getParameterMap().entrySet()) {
Map.Entry entry = (Map.Entry) obj;
MParameter p = CommandsFactoryImpl.eINSTANCE.createParameter();
@@ -596,15 +560,69 @@
p.setValue((String) entry.getValue());
keyBinding.getParameters().add(p);
}
- table.getBindings().add(keyBinding);
- if (!tablesToRemove.contains(table)) {
- final MBindingTable theTable = table;
- bindingsToRemove.add(new Runnable() {
- public void run() {
- theTable.getBindings().remove(keyBinding);
- }
- });
+
+ List<String> tags = keyBinding.getTags();
+ // just add the 'schemeId' tag if the binding is for anything other than
+ // the default scheme
+ if (binding.getSchemeId() != null
+ && !binding.getSchemeId().equals(BindingPersistence.getDefaultSchemeId())) {
+ tags.add(EBindingService.SCHEME_ID_ATTR_TAG + ":" + binding.getSchemeId()); //$NON-NLS-1$
}
+ if (binding.getLocale() != null) {
+ tags.add(EBindingService.LOCALE_ATTR_TAG + ":" + binding.getLocale()); //$NON-NLS-1$
+ }
+ if (binding.getPlatform() != null) {
+ tags.add(EBindingService.PLATFORM_ATTR_TAG + ":" + binding.getPlatform()); //$NON-NLS-1$
+ }
+ // just add the 'type' tag if it's a user binding
+ if (binding.getType() == Binding.USER) {
+ tags.add(EBindingService.TYPE_ATTR_TAG + ":user"); //$NON-NLS-1$
+ }
+ keyBinding.getTransientData().put(EBindingService.MODEL_TO_BINDING_KEY, binding);
+ return keyBinding;
+ }
+
+ private MKeyBinding findMKeyBinding(MBindingTable table, Binding binding) {
+ List<MKeyBinding> mBindings = table.getBindings();
+
+ String bindingSchemeId = binding.getSchemeId() == null ? IBindingService.DEFAULT_DEFAULT_ACTIVE_SCHEME_ID
+ : binding.getSchemeId();
+
+ if (binding.getParameterizedCommand() != null) {
+ String commandId = binding.getParameterizedCommand().getId();
+
+ for (MKeyBinding curr : mBindings) {
+ Binding transientBinding = (Binding) curr.getTransientData().get(
+ EBindingService.MODEL_TO_BINDING_KEY);
+ if (transientBinding != null) {
+ if (binding.equals(transientBinding)) {
+ return curr;
+ }
+ continue;
+ }
+ // check equality
+ if (curr.getKeySequence().equals(binding.getTriggerSequence().format())
+ && curr.getCommand() != null
+ && curr.getCommand().getElementId().equals(commandId)) {
+
+ String schemeId = IBindingService.DEFAULT_DEFAULT_ACTIVE_SCHEME_ID;
+ List<String> tags = curr.getTags();
+ // grab the scheme id from the tags
+ for (String tag : tags) {
+ if (tag.startsWith(EBindingService.SCHEME_ID_ATTR_TAG)) {
+ schemeId = tag.substring(9);
+ break;
+ }
+ }
+ // if the scheme ids are the same, then we found the
+ // MKeyBinding
+ if (schemeId.equals(bindingSchemeId)) {
+ return curr;
+ }
+ }
+ }
+ }
+ return null;
}
/**
@@ -615,6 +633,7 @@
* The binding to be removed; must not be <code>null</code>.
*/
public final void removeBinding(final Binding binding) {
+ MKeyBinding mKeyBinding;
MBindingTable table = null;
for (MBindingTable bt : application.getBindingTables()) {
if (bt.getBindingContext().getElementId().equals(binding.getContextId())) {
@@ -625,30 +644,36 @@
if (table == null) {
return;
}
- final MKeyBinding keyBinding = CommandsFactoryImpl.eINSTANCE.createKeyBinding();
- ParameterizedCommand parmCmd = binding.getParameterizedCommand();
- MCommand cmd = findCommand(parmCmd.getId());
- if (cmd == null) {
- return;
+ // if we're removing a user binding, just remove it from the model and
+ // the listeners will take care of removing the binding from the runtime
+ // system
+ if (binding.getType() == Binding.USER) {
+ mKeyBinding = this.findMKeyBinding(table, binding);
+ if (mKeyBinding != null) {
+ table.getBindings().remove(mKeyBinding);
+ }
}
- keyBinding.setCommand(cmd);
- keyBinding.setKeySequence(binding.getTriggerSequence().format());
- for (Object obj : parmCmd.getParameterMap().entrySet()) {
- Map.Entry entry = (Map.Entry) obj;
- MParameter p = CommandsFactoryImpl.eINSTANCE.createParameter();
- p.setElementId((String) entry.getKey());
- p.setName((String) entry.getKey());
- p.setValue((String) entry.getValue());
- keyBinding.getParameters().add(p);
+ // if we're removing a system binding, then find the model binding, add
+ // a 'deleted' tag, and explicitly remove the binding from the runtime
+ // system
+ else {
+ mKeyBinding = this.findMKeyBinding(table, binding);
+ if (mKeyBinding != null) {
+ mKeyBinding.getTags().add(EBindingService.DELETED_BINDING_TAG);
+ }
}
- table.getBindings().remove(keyBinding);
- // if we need to be clean:
- manager.removeBinding(binding);
}
public BindingManager getBindingManager() {
return manager;
}
+ public Collection<Binding> getActiveBindings() {
+ return bindingService.getActiveBindings();
+ }
+
+ public WorkbenchKeyboard getKeyboard() {
+ return new WorkbenchKeyboard(dispatcher);
+ }
}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/model/KeyController.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/model/KeyController.java
index 70ef47b..ce35e36 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/model/KeyController.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/keys/model/KeyController.java
@@ -16,7 +16,6 @@
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
-import java.util.Collection;
import java.util.Map;
import java.util.ResourceBundle;
import org.eclipse.core.commands.CommandManager;
@@ -27,7 +26,6 @@
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
-import org.eclipse.e4.ui.bindings.internal.BindingCopies;
import org.eclipse.jface.bindings.Binding;
import org.eclipse.jface.bindings.BindingManager;
import org.eclipse.jface.bindings.Scheme;
@@ -144,7 +142,7 @@
final Scheme copy = bindingManager.getScheme(scheme.getId());
copy.define(scheme.getName(), scheme.getDescription(), scheme
.getParentId());
- if (definedSchemes[i] == bindingService.getActiveScheme()) {
+ if (definedSchemes[i].getId().equals(bindingService.getActiveScheme().getId())) {
modelActiveScheme = copy;
}
}
@@ -154,6 +152,7 @@
new Status(IStatus.WARNING, WorkbenchPlugin.PI_WORKBENCH,
"Keys page found an undefined scheme", e)); //$NON-NLS-1$
}
+
bindingManager.setLocale(bindingService.getLocale());
bindingManager.setPlatform(bindingService.getPlatform());
bindingManager.setBindings(bindingService.getBindings());
@@ -425,15 +424,8 @@
*/
public void saveBindings(IBindingService bindingService) {
try {
-
- Collection<Binding> activeBindingsCollection = fBindingManager
- .getActiveBindingsDisregardingContextFlat();
- Binding[] activeBindingsArray = activeBindingsCollection
- .toArray(new Binding[activeBindingsCollection.size()]);
-
- bindingService.savePreferences(fBindingManager.getActiveScheme(), activeBindingsArray);
- // bindingService.savePreferences(fBindingManager.getActiveScheme(),fBindingManager.getBindings());
-
+ bindingService.savePreferences(fBindingManager.getActiveScheme(),
+ fBindingManager.getBindings());
} catch (IOException e) {
logPreferenceStoreException(e);
}
@@ -485,7 +477,6 @@
fBindingManager.setActiveScheme(defaultScheme);
} catch (final NotDefinedException e) {
// At least we tried....
- e.printStackTrace();
}
// Restore any User defined bindings
@@ -495,18 +486,6 @@
fBindingManager.removeBinding(bindings[i]);
}
}
- // Re-add the deactivated SYSTEM bindings
- bindings = BindingCopies.getInactiveSysBindings();
- for (int i = 0; i < bindings.length; i++) {
- fBindingManager.addBinding(bindings[i]);
- }
- // reset the binding copies
- BindingCopies.init();
-
- // set the binding manager's bindings array our copy of the system
- // bindings
- // fBindingManager.setBindings(BindingCopies.getSystemBindings().toArray(
- // new Binding[BindingCopies.getSystemBindings().size()]));
bindingModel.refresh(contextModel);
saveBindings(bindingService);