How can I define a custom action for "Open Declaration" (shortcut F3) in Eclipse
Asked Answered
U

3

9

How do I register an additional handler/action/command for "Open Declaration" (aka F3) in a plugin?

I want to use F3 on String literals in Java code to navigate to the files declaring resource bundle keys. I already have a context menu action ready that does the job. All that's missing is a way to bind it to the key that users are used to.

Extra credit for a complete annotated list of extension points. I'm getting tired of having to spend half a day to find the extension point I have to use for a feature. And by "annotated" I mean more than

Identifier: org.eclipse.ui.workbench.texteditor.quickdiffReferenceProvider
Description: Allows contributors to add reference providers for the quick diff display.
Umbilical answered 10/12, 2009 at 16:9 Comment(1)
I'm also looking for something similar. I would like to extend or override the open declaration extension point if one exists.Steddman
G
1

See section on keybindings in Eclipse Commands tutorial for detailed instructions how to implement command handlers and bind them to keys, menus and toolbars.

There is a full list of extension points provided in Eclipse help, though you have to drill down to get the full description and code samples. There is also an "Add extension point" wizard in plugin editor, which shows a brief description, link to the full help and for some extension points even have predefined templates.

Gunsmith answered 10/12, 2009 at 19:1 Comment(1)
I tried that and i was able to add a context menu item that shows i registered it for F3, but when i actually press F3, my code isn't called. Only when i select the menu item directly.Umbilical
F
1

Perhaps you know this, but although the F3 keyboard shortcut won't take you to the declaring resource bundle key, there are two similar things that do work:

  • Hovering over the string with the mouse will show you the converted string.
  • Control-clicking the string will jump you to the declaring resource bundle key.

Obviously, these both require use of the mouse; if you are a keyboard-only kind of person, you might not be happy with these.

This doesn't directly answer your question, but I hope it helps.

Freemon answered 12/12, 2009 at 18:33 Comment(1)
Actually i am happy with these but would also like the F3 shortcut. Only they don't work for us because we're not using Resourcebundles directly. We're using a wrapper class and eclipse doesn't know what to do with calls to that unless i implement some extension points. I already did that for the control click. All i need is the extension point to use for the shortcut.Umbilical
N
1

Unfortunately, there is no extension point for you to extend for this functionality. I recommend that you stop trying to muck around with the Eclipse Command Framework. The JavaEditor does not use that framework to register its commands, and instead, registers commands when the editor is opened. And there is no easy way for third parties to extend/change this.

The action that gets run when F3 is pressed is the org.eclipse.jdt.ui.actions.OpenAction.

Although there is no easy way to extend or change the JavaEditor, there are ways to do this. The one way that I recommend for your situation is through Equinox Aspects (http://www.eclipse.org/equinox/incubator/aspects/). This allows you to use AspectJ to weave into Eclipse and make changes where you require.

This is how AJDT (http://eclipse.org/ajdt) is able to alter the way JDT works.

In your particular situation, I'd recommend creating a pointcut that targets the instantiation of the OpenAction class and replace it with an implementation that you create. It delegates to JDT's implementation normally, or it runs your command when you require it.

If this is the kind of solution that you are looking for, then I can expand on exactly how to do this.

Neddie answered 21/2, 2011 at 5:54 Comment(2)
While this sounds like it might work, i'm shying away from using aspects to extend eclipse. Wouldn't this break on changes in the eclipse code much more easily than implementing extension point interfaces?Umbilical
Yes, if the dependent plugin exposed an extension point, that would more robust across future Eclipse versions. However, no extension point exists that allows you to do what you want. You can open a bug report and submit a patch for this, but there is no guarantee that the JDT UI team would accept the patch. So, a more sure way of implementing what you require would be to use weaving. Furthermore, there is a low risk of something like this changing across future Eclipse versions. This part of JDT if fairly stable and it is unlikely that any Aspects that you use would need to change.Neddie

© 2022 - 2024 — McMap. All rights reserved.