# Eclipse RCP: Multiple Keybindings



## foobar (7. Aug 2008)

Hi,

in meiner Anwendung gibt es für jeden Dialog ein Keybindng z.b. Strg+H für die History einer bestimmten Entity. In einer Sektion steht Strg+H z.b. für die History in einer anderen vielleicht für etwas anderes. 
Wenn ich jetzt aber 2 commands das selbe Keybinding zuordne gibt es einen Konflikt. Wie kann ich Eclipse jetzt sagen, daß ich irgendwie programatisch zwischen verschiedenen Commandsets oder sowas unterscheiden will? Wie löst man sowas am besten?
Ich hatte das selbe Problem auch schon mit identischen Keybindings in unterschiedlichen Perspektiven aber jetzt sind die Keybindings auch noch in der selben Perspektive.
Durch Onkel Google bin ich schon auf die ContextId im Command gestoßen. Hiermit kann man programmatisch zwischen Kontexten umschalten:


```
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
{
                public void run()
                {
                    ((IContextService) PlatformUI.getWorkbench().getService(IContextService.class)).activateContext("someContext");
                }
            });
```

Ist das schon die Endlösung der Keybindingfrage?

Viele Grüße,
foobar


----------



## Wildcard (7. Aug 2008)

Um ehrlich zu sein, ich habe es noch nicht benutzt, denke aber auch, dass Contexts genau das richtige sind.
Die einfachste Variante (für Views) stellt Eclipse auch selbst vor:
In createPartControl den Context aktivieren, in dispose deaktivieren. Liese sich in einem Dialog ja genauso erledigen.


----------



## foobar (7. Aug 2008)

http://pweclipse.blogspot.com/2006/06/what-can-command-framework-do-for-you.html



> IContextService can activate contexts, which can be used to scope the keybindings.



Ein Context ist also genau das was ich gesucht habe.

Jetzt mußte ich nur noch den alten Context deaktivieren, damit immer nur einer aktiv ist:


```
IContextService conServ = ((IContextService) PlatformUI.getWorkbench().getService(IContextService.class));
            
            if (null != activeContext)
            {
                conServ.deactivateContext(activeContext);    
            }
            
            activeContext = conServ.activateContext(subperspectiveName);
```

Jetzt läuft alles


----------

