■[Seasar][Uruma] RCPモードのポップアップメニューについて

id:y-komori さん。ありがとうございます。

■[Seasar][Uruma] RCPモードのポップアップメニューについて
id:susie_y さんへ。http://d.hatena.ne.jp/susie_y/20080530/1212152933 への回答です。

http://d.hatena.ne.jp/y-komori/20080531/1212187923

以下、回答します。
長文です。すいませーん。

メニュー化け

ただ、私の環境だと「パースペクティブの表示」などの組み込みメニューが化けてしまっていますが、大丈夫ですか?

すいません。どういう風に化けてますか? 画面キャプチャーなど頂けると助かります。
あと、検証したサンプルはRSSでかつ、最新ですか?

ポップアップメニュー定義

ポップアップメニューは同一画面内で複数の画面コンポーネントに対して同じものを使い回す可能性があるので、以下のような定義方法になっています。





方針は了解しました。
以下、仕様案です。こんな感じでどうでしょう?

  • ポップアップのメニュー要素はviewPart要素の直下にを記載する
  • ポップアップメニューの定義は、viewPart内で一意に定義し、同一viewPart内の各画素から共用で利用できる
  • ビューの右上のメニューとツールボタンのメニューはidにviewと定義する


サンプル画面XML

<?xml version="1.0" encoding="UTF-8"?>
<template xmlns="http://uruma.sandbox.seasar.org">
  <viewPart title="フィードツリー・ビュー">

    <!-- ビューの右上のメニューとツールバーボタン -->  
    <!-- id に view と定義する(値固定)-->  
    <menu id="view">
      <menu text="メニューグループ3(&amp;F)">
        <menuItem id="menu4" text="メニュー4(&amp;S)" image="uruma"
          accelerator="Ctrl+S" />

        <menuItem id="menu5" text="メニュー5(&amp;F)" image="rss" 
          accelerator="Ctrl+F" />
      </menu>       
    </menu>

    <!-- ビュー内で共用のポップアップメニュ -->  
    <!-- id に popup1 などと定義する(値可変)-->  
     <menu id="popup1">
       <menu text="メニューグループpopup(&amp;F)" image="uruma">
         <menuItem id="menu6" text="メニュー6(&amp;G)" image="uruma"
           accelerator="Ctrl+G" />
         <menuItem id="menu7" text="メニュー7(&amp;H)" image="rss" 
           accelerator="Ctrl+H" />
       </menu>
       <menuItem id="menu8" text="メニュー8(&amp;J)" image="rss" 
           accelerator="Ctrl+J" />       
     </menu>    

    <!-- ビュー内で共用のポップアップメニュ -->  
    <!-- id に popup2 などと定義する(値可変)-->  
    <menu id="popup2">
       <menuItem id="menu9" text="メニュー8(&amp;J)" image="rss" 
           accelerator="Ctrl+J" />       
    </menu>    
    
    <!-- ポップアップメニュ popup1 と紐づけ -->  
    <tree id="feedTree1" menu="popup1" autoExpandLevel="2">
    </tree>

    <!-- ポップアップメニュ popup1 と紐づけ -->  
    <tree id="feedTree2" menu="popup1" autoExpandLevel="2">
    </tree>

    <!-- ポップアップメニュ popup2 と紐づけ -->  
    <tree id="feedTree3" menu="popup2" autoExpandLevel="2">
    </tree>

  </viewPart>
</template>
セレクションオブジェクト

これでは、もう少し拡張して考えるとイベントが発生したときに、アクション側で発生元のオブジェクトを知りたいという問題に抽象化できると思います。

そうですね。
まだ、調査不足なのでもう少しデバッグしてみます。

メニューの表示箇所と表示可否の制御

ひとまず、画面定義XML側の仕様から案を練っていきましょうか。

今考えている仕様案です。

  • メニュー要素の表示可否ロジックをアクション内の任意のメソッドに定義する
  • 定義メソッドがない場合は表示をデフォルトとする
  • 画面XMLは上記の画面XMLと同じ(とくに追記なし)
  • メソッドはメソッドバインディングでUrumaと紐づけ

EventListenerType.ISSHOW というタイプを作ろうかと。
SWTに存在しないリスナータイプなのでちょっとイケテナイですがw


メソッドはこんな感じ。

	@EventListener(id = "menu4", type = EventListenerType.ISSHOW)
	public boolean isShowMenu4(final Object obj) {
		// obj はセレクションオブジェクト
		if (obj instanceof HogeDto) {
			return true;
		} 
		return false;
	}

ほかによい方法があれば、ご示唆ください。

サブメニューを持つメニューのアイコン表示不可

パスはちゃんと取得できているんですよ。以下plugin.xmlの抜粋ですが定義も正しいのでEclipseって表示できないのでは?と思っていますが。。。

<menu mnemonic="F" icon="bin/images/uruma16.png" label="メニューグループpopup(F)" > 
<command commandId="org.seasar.uruma.example.rss.command.menu6" mnemonic="G" icon="bin/images/uruma16.png" > </command> 
<command commandId="org.seasar.uruma.example.rss.command.menu7" mnemonic="H" icon="bin/images/rss.png" > </command> 
</menu>