Eclipse/RCPはplugin.xmlで宣言的にキーバインディング*1を設定することができます。Eclipseの
ウィンドウ >> 設定 の 一般 >> キー
に表示されるヤツですね。これでCtrl+Sで保存とか、いわゆるキーボードのショートカットを定義することができます。
キーをバインドする仕組みについてですが、まず「コマンド」というモノを定義して、そのコマンドにキーを関連づけます。さらにそのコマンドに対して、アクションを関連づけることで
あるキーを押す-> コマンドが決まる -> そのコマンドのアクションが実行される
といった流れになります。
<extension point="org.eclipse.ui.commands"> <category id="nu.mine.kino.plugin.samples.rcp.category" name="Sample"/> <command categoryId="nu.mine.kino.plugin.samples.rcp.category" <-categoryのid属性 id="nu.mine.kino.plugin.samples.rcp.command" name="サンプルコマンド"/> </extension> <extension point="org.eclipse.ui.bindings"> <key sequence="F10" <-F10を割当 commandId="nu.mine.kino.plugin.samples.rcp.command" <-commandのid属性 schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"> </key> ↑ デフォルトのスキーム ほかに org.eclipse.ui.emacsAcceleratorConfiguration がある </extension>
これで、コマンドとそのキーバインドが定義されました。
カテゴリが「Sample」、コマンドが「サンプルコマンド」、キーが「F10」という設定が追加されている。
さらに、スキームは「デフォルト」になっている
次にこのコマンドにアクションを関連づけますが、それはアクションの拡張ポイントにコマンドのIDを与えてやることで実現します。たとえばこんな感じです。
<action class="nu.mine.kino.plugin.samples.rcp.actions.HogeAction" definitionId="nu.mine.kino.plugin.samples.rcp.command" <- commandのid id="nu.mine.kino.plugin.samples.rcp.actions.HogeAction" label="アクション。" menubarPath="topmenu/sepa01" style="push"/>
以上で、あるアクションに対してキーをバインドすることができました。
キーのバインドで
<key sequence="F10" <-F10を割当
としましたが、たとえば「Ctrl+S」の場合は
<key sequence="Ctrl+S"
とします。複数書く場合は
<key sequence="Ctrl+X Ctrl+S"
などとなります。
Ctrlなど特殊なキーは、プラットフォーム非依存にするためにエイリアスがきってあります。
M1 (WindowsはCtrl、MacはCommand) M2 (Shift) M3 (WindowsはAlt、MacはOption) M4 (MacはCtrl、その他は未定義)
などがあるようです。詳細はEclipseヘルプを「M1 M2」などで検索しましょう。
プログラマティカルにアクションを追加した場合は、そのアクションクラス内で
Action#setActionDefinitionId("nu.mine.kino.plugin.samples.rcp.command");
としてコマンドのIDと関連づけましょう。
<key sequence="M1+Q" commandId="org.eclipse.ui.file.exit" <- QuitActionのコマンドID schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"> </key>
ちなみにQuitAction?のコンストラクタのソースはこんな感じ
public QuitAction(IWorkbenchWindow window) { // Although window is not currently used, // this follows the same pattern as other ActionFactory actions. if (window == null) { throw new IllegalArgumentException(); } this.workbenchWindow = window; setText(WorkbenchMessages.Exit_text); setToolTipText(WorkbenchMessages.Exit_toolTip); setActionDefinitionId("org.eclipse.ui.file.exit"); //$NON-NLS-1$ window.getWorkbench().getHelpSystem().setHelp(this, IWorkbenchHelpContextIds.QUIT_ACTION); }
この記事は
quitAction = ActionFactory.QUIT.create(window); register(quitAction);おきまりのコーディングだよなあって思ってたけど、まあいっか。。 -- きの? 2006-03-25 18:16:49 (土)
現在のアクセス:18629