ログ編
UrumaとUrumaアプリとUruma以外のUrumaに依存しないプラグイン(オレオレプラグイン)からlog4jの設定を共通で利用したい。log4jを利用するプラグインは設定ファイルを一意にしたいため。
でも、Uruma、Urumaアプリと、オレオレプラグインはlog4jの設定を共用できません。各プラグインロードするlog4jのクラスが異なるため。
ということで、Urumaからapache log4jと commons logingを別プラグインとして切り出し、各プラグインから参照するようにする。
あれ、commons logingのクラスを認識しない?!各プラグインの依存設定も、commons logingのExported Packagesも正しいのになぁ。しょうがないので、commons logingをslf4jに置き換え。うまくいった。
Uruma、Urumaアプリではニーズがない対応と思うのでコミットはしないでおく。プラグインを分割すると配布や管理がややこしくなるし、ユーザの稼働失敗の確率も高くなるしね。
デザインを変えました
気分転換。
■[Seasar][Uruma] RCPモードのポップアップメニューについて
id:y-komori さん。ありがとうございます。
■[Seasar][Uruma] RCPモードのポップアップメニューについて
http://d.hatena.ne.jp/y-komori/20080531/1212187923
id:susie_y さんへ。http://d.hatena.ne.jp/susie_y/20080530/1212152933 への回答です。
以下、回答します。
長文です。すいませーん。
メニュー化け
ただ、私の環境だと「パースペクティブの表示」などの組み込みメニューが化けてしまっていますが、大丈夫ですか?
すいません。どういう風に化けてますか? 画面キャプチャーなど頂けると助かります。
あと、検証したサンプルは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(&F)"> <menuItem id="menu4" text="メニュー4(&S)" image="uruma" accelerator="Ctrl+S" /> <menuItem id="menu5" text="メニュー5(&F)" image="rss" accelerator="Ctrl+F" /> </menu> </menu> <!-- ビュー内で共用のポップアップメニュ --> <!-- id に popup1 などと定義する(値可変)--> <menu id="popup1"> <menu text="メニューグループpopup(&F)" image="uruma"> <menuItem id="menu6" text="メニュー6(&G)" image="uruma" accelerator="Ctrl+G" /> <menuItem id="menu7" text="メニュー7(&H)" image="rss" accelerator="Ctrl+H" /> </menu> <menuItem id="menu8" text="メニュー8(&J)" image="rss" accelerator="Ctrl+J" /> </menu> <!-- ビュー内で共用のポップアップメニュ --> <!-- id に popup2 などと定義する(値可変)--> <menu id="popup2"> <menuItem id="menu9" text="メニュー8(&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>
[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(&F)"> <menuItem id="menu4" text="メニュー4(&S)" image="uruma" accelerator="Ctrl+S" /> <menuItem id="menu5" text="メニュー5(&F)" image="rss" accelerator="Ctrl+F" /> </menu> </menu> <tree id="feedTree" autoExpandLevel="2"> <menu> <menu text="メニューグループpopup(&F)" image="uruma"> <menuItem id="menu6" text="メニュー6(&G)" image="uruma" accelerator="Ctrl+G" /> <menuItem id="menu7" text="メニュー7(&H)" image="rss" accelerator="Ctrl+H" /> </menu> <menuItem id="menu8" text="メニュー8(&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(&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(&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
[Seasar][Uruma][RCP] Eclipse V3.3仕様のメニューの作り方参考サイト
Eclipse V3.3仕様のメニューを作るための参考サイトが少ないのでメモメモしときます。
英語
[Seasar][Uruma][RCP]Toolbarを表示したい その5
実装完了。こんな感じ。
- Toolbarにボタンが表示できるようになった
- Viewにメニューとボタンが表示できるようになった
後は、ポップアップメニューの対応かな。
ポップアップメニューは表示可否をどうやって制御(XMLの書き方、Javano書き方)するか考える必要があるな。
Toolbarを表示したい その4
Urumaがplugin.xmlをどうやって出力しているか調査。
ContributionBuilder
Urumaでplugin.xmlの生成はContributionBuilderが行います。
ContributionBuilderはExtensionBuilderからExtensionを作成します。
ExtensionがStringWriterを受け取ってplugin.xmlを生成します。
生成したplugin.xmlをregistryに渡してRCPに反映します。
ExtensionRegistry registry = Platform.getExtensionRegistry();
ExtensionBuilder
ExtensionBuilderの具象クラスは以下のとおり。
- MenusBuilder
- ViewsBuilder
- PerspectivesBuilder
ExtensionBuilderはExtensionFactoryでExtensionの具象クラスを生成します。
例
ExtensionFactory.createExtension(ExtensionPoints.COMMANDS);
Extensionの拡張ポイントの種類は以下のとおり。
- org.eclipse.core.runtime.applications
- org.eclipse.core.runtime.preferences
- org.eclipse.ui.views
- org.eclipse.ui.perspectives
- org.eclipse.ui.actionSets
- org.eclipse.ui.commands
- org.eclipse.ui.handlers
- org.eclipse.ui.bindings
- org.eclipse.ui.menus
- org.eclipse.ui.contexts
ExtensionBuilderは作成したExtensionに関連するElementを作成しExtensionにセットしContributionBuilderに返却します。
各Elementは以下のとおり。
- Extension
- ActionElement
- ActionSetElement
- ApplicationElement
- CategoryElement
- ClassElement
- CommandElement
- ContextElement
- GroupMarkerElement
- HandlerElement
- InitializerElement
- KeyElement
- MenuCommandElement
- MenuContributionElement
- MenuElement
- ParameterElement
- PerspectiveElement
- RunElement
- SchemeElement
- ViewElement
ExtensionFactory
ExtensionFactoryはConfigurationWriterFactoryでExtentionエレメントのConfigurationWriterを作成します。作成したExtentionにElementをセットし、ExtensionBuilderにExtensionを返却します。