#author("2022-05-09T23:13:40+00:00","","")
#topicpath
----
//ここにコンテンツを記述します。



#contents


Eclipse/RCPはplugin.xmlで宣言的にキーバインディング((ショートカットキーといえばよい?キーボード・アクセラレーターというヒトもいる))を設定することができます。Eclipseの
 ウィンドウ >> 設定 の 一般 >> キー 
に表示されるヤツですね。これでCtrl+Sで保存とか、いわゆるキーボードのショートカットを定義することができます。


#ref(key.png)


**コマンドの定義 [#b82cda45]
キーをバインドする仕組みについてですが、まず「コマンド」というモノを定義して、そのコマンドにキーを関連づけます。さらにそのコマンドに対して、アクションを関連づけることで
 あるキーを押す-> コマンドが決まる -> そのコマンドのアクションが実行される
といった流れになります。



***plugin.xml [#h7fb9324]
 <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>


これで、コマンドとそのキーバインドが定義されました。

#ref(view.png)
カテゴリが「Sample」、コマンドが「サンプルコマンド」、キーが「F10」という設定が追加されている。

#ref(mod.png)
さらに、スキームは「デフォルト」になっている


**アクションの関連づけ [#ucd94450]
次にこのコマンドにアクションを関連づけますが、それはアクションの拡張ポイントにコマンドの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"/>


以上で、あるアクションに対してキーをバインドすることができました。

#ref(F10.png)



**TIPS [#p5d86806]
***キーシーケンスの値について [#l3064cdd]
キーのバインドで
 <key sequence="F10" <-F10を割当
としましたが、たとえば「Ctrl+S」の場合は
 <key sequence="Ctrl+S"
とします。複数書く場合は
 <key sequence="Ctrl+X Ctrl+S" 
などとなります。


***Ctrlなど特殊なキーをプラットフォームに依存しないで設定するには [#g296e9c1]
Ctrlなど特殊なキーは、プラットフォーム非依存にするためにエイリアスがきってあります。
 M1 (WindowsはCtrl、MacはCommand)
 M2 (Shift)
 M3 (WindowsはAlt、MacはOption)
 M4 (MacはCtrl、その他は未定義)
などがあるようです。詳細はEclipseヘルプを「M1 M2」などで検索しましょう。


***プログラマティカルにアクションを追加した場合 [#x8561efb]
プログラマティカルにアクションを追加した場合は、そのアクションクラス内で
 Action#setActionDefinitionId("nu.mine.kino.plugin.samples.rcp.command");
としてコマンドのIDと関連づけましょう。


***Ctrl+Qで、アプリケーションを終了する [#v1fc9234]
 <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);
 }


***リンク [#gb815323]
-Eclipseヘルプを「ワークベンチ・キー・バインディング」で検索しましょう。
-Eclipseヘルプを「M1 M2」で検索しましょう。
-Eclipse/プラグイン開発のTIPS集/キーバインディングを設定する(Eclipse3.3版)


----
この記事は
#vote(おもしろかった[8],そうでもない[0])
#vote(おもしろかった[13],そうでもない[1])
-すでにあるヤツとバッティングするCtrl+Sとかはうまくいかないなあ。この辺の解決方法がまだわかんない。。。 -- [[きの]] &new{2006-03-25 17:27:58 (土)};
-いったんコマンドIDを付けたアクションは、Workbenchに登録されてなくてはならない、と[[Eclipse Rich Client Platform の本:http://www.amazon.co.jp/exec/obidos/redirect?tag=kinosite-22&creative=203&camp=23&link_code=st1&adid=08Q0CN8N57JPRN1SHXFR&path=tg/sim-explorer/explore-items/-/0321334612]]には書いてありますね。んで、この登録コマンドが、おきまりのActionBarAdvisor#register(action)なんですね。ユーザ入力に対して、その入力値にマッチするアクションがあるかを探すために必要なのかなあ。
 quitAction = ActionFactory.QUIT.create(window);
 register(quitAction);
おきまりのコーディングだよなあって思ってたけど、まあいっか。。 -- [[きの]] &new{2006-03-25 18:16:49 (土)};
- Eclipse 3.3からこのcommandの仕組みを用いてアクション関連を定義するらしい。。。うーんまた思い出さんと(´д`;) -- [[きの]] &new{2009-02-18 (水) 17:01:54};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS