[Seasar][Uruma][RCP] Eclipse V3.3仕様でポップアップを表示する

なんとかポップアップの表示ができました。


XMLはこんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<template xmlns="http://uruma.sandbox.seasar.org">
  <viewPart title="フィードツリー・ビュー">
  
    <menu>
      <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>
    
    <tree id="feedTree" autoExpandLevel="2">
	    <menu>
	      <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>
    </tree>
  </viewPart>
</template>


Javaはこんな感じ。

	・・・

	@EventListener(id = "menu4", type = EventListenerType.SELECTION)
	public void doMenu4(final Object obj) {
		MessageDialog.openInformation(null, "メニュー4", "メニュー4クリック!!");
	}
	
	・・・

課題&残タスク

id:y-komori さん アドバイスがあればよろしくです。

ポップアップ可能なコンポーネントを決める

今はTreeViewのみ実装。uruma.xsdとComponentをそれぞれ実装する必要があり。
スキーマはabstractになっているエレメントで決め打ちができればええけど。

クリックしたときのセレクションオブジェクト(ツリーの値)を@EventListenerのメソッドに渡せない

引数のObjectにはEventオブジェクトが入ってきて、中身はクリックしたポップアップメニューでしたww

メニューの表示箇所と表示可否の制御ができない

こんな感じで visibleWhen とdefinition を定義しようかなぁ。
って難しいのう。。。これは。
画面XMと、equals valueのクラスの書き方をどうしたものか。
今の実装は、どこ(ツリー、テーブルとか)をクリックしても同じポップアップが出る仕様。

visibleWhenとdefinitionの例

... org.eclipse.core.expressions.definitions
<definition
   id="org.eclipse.ui.examples.contributions.view.activeEditor">
      <with variable="activeEditorId">
         <equals value="org.eclipse.ui.examples.contributions.editor">
         </equals>
      </with>
</definition>
... org.eclipse.ui.menus
<menuContribution
locationURI="menu:org.eclipse.ui.main.menu?after=additions">
   <menu
      id="org.eclipse.ui.examples.contributions.editor.menu"
      label="%contributions.editor.menu.label"
      mnemonic="%contributions.editor.menu.mnemonic">
      <command
         commandId="org.eclipse.ui.examples.contributions.editor.reset"
         mnemonic="%contributions.editor.reset.mnemonic">
         <visibleWhen>
            <reference
               definitionId="org.eclipse.ui.examples.contributions.view.activeEditor">
            </reference>
         </visibleWhen>
      </command>
   </menu>
</menuContribution>
menuで下階層のサブメニューを持つ場合アイコンが表示できない

Eclipseでいろいろな所を右クリックしてポップアップメニューを表示してみたけど、確かにサブメニューを持つメニューにアイコンがない。

うーむ。表示できんのか。スキーマにはmenuにiconアトリビュートがあるのに。
ということで、これはあきらめ。

<!ELEMENT menu (visibleWhen? , (menu? | command? | separator? | dynamic?)*)?>
<!ATTLIST menu
id       CDATA #IMPLIED
mnemonic CDATA #IMPLIED
icon     CDATA #IMPLIED
tooltip  CDATA #IMPLIED
label    CDATA #REQUIRED>

おまけ

Urumaが出力したplugin.xmlを貼っておきます。

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
 <extension point="org.eclipse.ui.contexts" >
  <context id="org.seasar.uruma.example.rss.context" name="Uruma allication local context" parentId="org.eclipse.ui.contexts.window" />
 </extension>
 <extension point="org.eclipse.ui.commands" >
  <category id="org.seasar.uruma.example.rss.command.category" name="org.seasar.uruma.example.rss" />
  <command id="org.seasar.uruma.example.rss.command.menu1" name="メニュー1(O)" categoryId="org.seasar.uruma.example.rss.command.category" />
  <command id="org.seasar.uruma.example.rss.command.menu2" name="メニュー2(D)" categoryId="org.seasar.uruma.example.rss.command.category" />
  <command id="org.seasar.uruma.example.rss.command.menu3" name="メニュー3(A)" categoryId="org.seasar.uruma.example.rss.command.category" />
  <command id="org.seasar.uruma.example.rss.command.menu4" name="メニュー4(S)" categoryId="org.seasar.uruma.example.rss.command.category" />
  <command id="org.seasar.uruma.example.rss.command.menu5" name="メニュー5(F)" categoryId="org.seasar.uruma.example.rss.command.category" />
  <command id="org.seasar.uruma.example.rss.command.menu6" name="メニュー6(G)" categoryId="org.seasar.uruma.example.rss.command.category" />
  <command id="org.seasar.uruma.example.rss.command.menu7" name="メニュー7(H)" categoryId="org.seasar.uruma.example.rss.command.category" />
  <command id="org.seasar.uruma.example.rss.command.menu8" name="メニュー8(J)" categoryId="org.seasar.uruma.example.rss.command.category" />
 </extension>
 <extension point="org.eclipse.ui.handlers" >
 </extension>
 <extension point="org.eclipse.ui.bindings" >
  <scheme id="org.seasar.uruma.keyConfiguration" name="UrumaApplication" />
  <key sequence="Ctrl+O" schemeId="org.seasar.uruma.keyConfiguration" contextId="org.eclipse.ui.contexts.window" commandId="org.seasar.uruma.example.rss.command.menu1" />
  <key sequence="DELETE" schemeId="org.seasar.uruma.keyConfiguration" contextId="org.eclipse.ui.contexts.window" commandId="org.seasar.uruma.example.rss.command.menu2" />
  <key sequence="Ctrl+A" schemeId="org.seasar.uruma.keyConfiguration" contextId="org.eclipse.ui.contexts.window" commandId="org.seasar.uruma.example.rss.command.menu3" />
  <key sequence="Ctrl+S" schemeId="org.seasar.uruma.keyConfiguration" contextId="org.eclipse.ui.contexts.window" commandId="org.seasar.uruma.example.rss.command.menu4" />
  <key sequence="Ctrl+F" schemeId="org.seasar.uruma.keyConfiguration" contextId="org.eclipse.ui.contexts.window" commandId="org.seasar.uruma.example.rss.command.menu5" />
  <key sequence="Ctrl+G" schemeId="org.seasar.uruma.keyConfiguration" contextId="org.eclipse.ui.contexts.window" commandId="org.seasar.uruma.example.rss.command.menu6" />
  <key sequence="Ctrl+H" schemeId="org.seasar.uruma.keyConfiguration" contextId="org.eclipse.ui.contexts.window" commandId="org.seasar.uruma.example.rss.command.menu7" />
  <key sequence="Ctrl+J" schemeId="org.seasar.uruma.keyConfiguration" contextId="org.eclipse.ui.contexts.window" commandId="org.seasar.uruma.example.rss.command.menu8" />
 </extension>
 <extension point="org.eclipse.ui.menus" >
  <menuContribution locationURI="menu:org.eclipse.ui.main.menu?after=additions" >
   <menu mnemonic="F" label="メニューグループ1(F)" >
    <command commandId="org.seasar.uruma.example.rss.command.menu1" mnemonic="O" icon="bin/images/uruma16.png" >
    </command>
    <separator name="none" visible="true" >
    </separator>
    <command commandId="org.seasar.uruma.example.rss.command.menu2" mnemonic="D" icon="bin/images/rss.png" >
    </command>
   </menu>
   <menu mnemonic="E" label="メニューグループ2(E)" >
    <command commandId="org.seasar.uruma.example.rss.command.menu3" mnemonic="A" icon="bin/images/rss.png" >
    </command>
   </menu>
  </menuContribution>
  <menuContribution locationURI="popup:org.eclipse.ui.popup.any?after=additions" >
   <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>
   <command commandId="org.seasar.uruma.example.rss.command.menu8" mnemonic="J" icon="bin/images/rss.png" >
   </command>
  </menuContribution>
  <menuContribution locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions" >
   <toolbar id="org.seasar.uruma.example.rss.toolbar.メニューグループ1(&amp;F)" >
    <command commandId="org.seasar.uruma.example.rss.command.menu1" mnemonic="O" icon="bin/images/uruma16.png" style="push" >
    </command>
    <command commandId="org.seasar.uruma.example.rss.command.autoDefinedAction_0" style="push" >
    </command>
    <command commandId="org.seasar.uruma.example.rss.command.menu2" mnemonic="D" icon="bin/images/rss.png" style="push" >
    </command>
   </toolbar>
   <toolbar id="org.seasar.uruma.example.rss.toolbar.メニューグループ2(&amp;E)" >
    <command commandId="org.seasar.uruma.example.rss.command.menu3" mnemonic="A" icon="bin/images/rss.png" style="push" >
    </command>
   </toolbar>
  </menuContribution>
  <menuContribution locationURI="menu:org.seasar.uruma.example.rss.urumaDebugView?after=additions" >
  </menuContribution>
  <menuContribution locationURI="toolbar:org.seasar.uruma.example.rss.urumaDebugView?after=additions" >
  </menuContribution>
  <menuContribution locationURI="menu:org.seasar.uruma.example.rss.feedTreeView?after=additions" >
   <command commandId="org.seasar.uruma.example.rss.command.menu4" mnemonic="S" icon="bin/images/uruma16.png" >
   </command>
   <command commandId="org.seasar.uruma.example.rss.command.menu5" mnemonic="F" icon="bin/images/rss.png" >
   </command>
  </menuContribution>
  <menuContribution locationURI="toolbar:org.seasar.uruma.example.rss.feedTreeView?after=additions" >
   <command commandId="org.seasar.uruma.example.rss.command.menu4" mnemonic="S" icon="bin/images/uruma16.png" style="push" >
   </command>
   <command commandId="org.seasar.uruma.example.rss.command.menu5" mnemonic="F" icon="bin/images/rss.png" style="push" >
   </command>
  </menuContribution>
  <menuContribution locationURI="menu:org.seasar.uruma.example.rss.feedListView?after=additions" >
  </menuContribution>
  <menuContribution locationURI="toolbar:org.seasar.uruma.example.rss.feedListView?after=additions" >
  </menuContribution>
  <menuContribution locationURI="menu:org.seasar.uruma.example.rss.feedBrowserView?after=additions" >
  </menuContribution>
  <menuContribution locationURI="toolbar:org.seasar.uruma.example.rss.feedBrowserView?after=additions" >
  </menuContribution>
 </extension>
 <extension point="org.eclipse.core.expressions.definitions" >
 </extension>
 <extension point="org.eclipse.ui.views" >
  <view id="org.seasar.uruma.example.rss.urumaDebugView" name="デバッグ・ビュー" class="org.seasar.uruma.rcp.ui.GenericViewPart" allowMultiple="false" />
  <view id="org.seasar.uruma.example.rss.feedTreeView" name="フィードツリー・ビュー" class="org.seasar.uruma.rcp.ui.GenericViewPart" allowMultiple="false" />
  <view id="org.seasar.uruma.example.rss.feedListView" name="フィード・ビュー" class="org.seasar.uruma.rcp.ui.GenericViewPart" allowMultiple="false" />
  <view id="org.seasar.uruma.example.rss.feedBrowserView" name="ブラウザ・ビュー" class="org.seasar.uruma.rcp.ui.GenericViewPart" allowMultiple="false" />
 </extension>
 <extension point="org.eclipse.ui.perspectives" >
  <perspective id="org.seasar.uruma.example.rss.defaultPerspective" name="RSS" class="org.seasar.uruma.rcp.ui.GenericPerspectiveFactory" icon="uruma" fixed="false" />
 </extension>
</plugin>

追記: ポップアップの表示可否の案メモ

Adding a Property Tester

To add a property tester to an enablement expression, try using the following example. In your plugin.xml, add the propertyTesters extension point:




Inside your plugin, add and implement the property tester code:

package org.eclipse.myplugin.internal;
import org.eclipse.core.expressions.PropertyTester;

public class MyPropertyTester extends PropertyTester {
public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
// cast receiver and/or expectedValue
// if (xx) // check some dynamic property
return true;
// else
//return false;
}
}

You can now use a property expression within the enablement:

http://www.eclipse.org/webtools/wst/components/server/runOnServer.html