現在、キーボードショートカットでトリガーできるアクションをトリガーする一連のツールバーボタンを含むEclipse RCPプラグインを開発中です。私のJavaコードでcommandIdを使用してアクティブなキーバインドを取得する
<plugin>
<extension point="org.eclipse.ui.contexts">
<context id="notepad4e.context" name="In Notepad4e" parentId="org.eclipse.ui.contexts.window" />
</extension>
<extension point="org.eclipse.ui.commands">
<category id="notepad4e.command.category" name="Notepad4e" description="Category for Notepad4e commands" />
<command categoryId="notepad4e.command.category" id="notepad4e.command.text.bold" description="Sets style to bold" name="Bold" />
</extension>
<extension point="org.eclipse.ui.bindings">
<key commandId="notepad4e.command.text.bold" contextId="notepad4e.context" sequence="CTRL+B" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
</extension>
</plugin>
、私は正確に活性化しています:ここで
は、コンテキスト、コマンドとショートカットの結合に対応するキーを使用して、私ののplugin.xmlファイルの関連部分でありますnotepad4e.context
私のビューと対応するキーボードイベントを聴くハンドラをアクティブにします。キーボードのショートカットは正常に動作しているように見えます。ユーザは、Eclipseの環境設定でキーバインドを再定義して、自分のニーズに最も適したものにすることができます。
私は次のようにバインディングに関する情報をツールバーボタンにツールチップテキストを設定したいと思います:ユーザーがバインドを変更する場合がありますよう
私は、キーバインディング情報をハードコーディングすることができず、ハードコードされた値はもはや有効ではありません。私は、プログラムで指定されたコマンドのキーバインディングを取得するソリューションを考え出しています。私は、次の3つの試みがIBindingServiceをウッシング持っている:
private String getShortcutDescription1() {
IBindingService bindingService = getViewSite().getService(IBindingService.class);
TriggerSequence triggerSequence = bindingService.getBestActiveBindingFor("notepad4e.command.text.bold");
if (triggerSequence != null) {
return triggerSequence.format();
}
return "";
}
private String getShortcutDescription2() {
IBindingService bindingService = getViewSite().getService(IBindingService.class);
TriggerSequence[] triggerSequences = bindingService.getActiveBindingsFor("notepad4e.command.text.bold");
if (triggerSequences.length > 0) {
return triggerSequences[0].format();
}
return "";
}
private String getShortcutDescription3() {
IBindingService bindingService = getViewSite().getService(IBindingService.class);
for (Binding binding : bindingService.getBindings()) {
if (binding.getParameterizedCommand() != null
&& "notepad4e.command.text.bold".equals(binding.getParameterizedCommand().getId())) {
return binding.getTriggerSequence().format();
}
}
return "";
}
二つの第一の解決策は、いずれかがnotepad4e.command.text.bold
のcommandIdに関連付けられたバインディング見つけるように見えることはありません。しかし、第3の解決策では、私は予想される拘束力を見つける。それにもかかわらず、Eclipseのバインディングはすべて効率的なソリューションのようには見えません。さらに重要なのは、ユーザが自分の設定でデフォルトのショートカットを再定義した場合、bindingService.getBindings()
コールは、非アクティブなデフォルトバインディングとアクティブな再定義されたユーザこれは私が探している値を返しません。
私はここで何が欠けていますか?与えられたcommandIdのアクティブなキーバインディングをプログラムでどのように取得できますか?
ありがとうございました。お手数をおかけしますようお願い申し上げます。
EDIT 17/01: 2つの最初の解決方法では、目的のバインディングが返されますが、ユーザーがプラグインとやりとりした後にのみ表示されます。これは、プラグインの設定中にツールヒントを設定しようとしているため、現実的ではありません。
'Binding :: getContextId()'を使用して、コンテキストの正しいバインディングを見つけることができるはずです。 –
@RüdigerHerrmann:3番目のメソッドの試行を参照している場合、残念ながら 'bindingService.getBindings() 'によって返された2つのバインディングは同じcontextIDを持ちます。 – Pyves