この機能は Kepler M4 で実現されました。使用方法の詳細については、私のブログを参照してください。
ビュー ツールバーにあるハンドラーのメニューへの完全に動的なメニューの貢献を実現したいと考えています。Eclipse 3 では、メニューへの org.eclipse.ui.menus の貢献として「動的」を追加することが可能でした!
私はすでにwww.vogella.com/blog/2010/10/26/processors-e4-modelで、プロセッサ モデルの拡張によってメニューに動的に貢献する方法を説明していることを知りましたが、変更される完全に動的なメニューの実装について話しているのです。担当者のすべての呼び出しで。サブメニュー。前述のように、動的メニューの提供と isDynamic() を true に設定することにより、これは Eclipse 3.x で実現するのに問題はありませんでした。
私はすでにいくつかのアプローチを試しました:
- メニューにフックするプロセッサを登録する => 動的な追加はできません (新しい要素は単に表示されず、Eclipse フォーラムでも議論されています - 実行時にメニュー項目を置き換えることはできません)
- メニューを作成するイベントの UIEventTopic をリッスンし、Modification のウィジェットを取得 => 収集された swt.Menu への変更は単純に無視されます (すべてのリスナー、要素など) (情報RCP イベント モデルについては
未経験のオープンなソリューション
- ToolControl を挿入して SWT アプローチを試す -> 非常に複雑ですが、うまくいく可能性があります
私はしばらく頭を悩ませてきましたが、E4 内でこの問題の正しい実装を理解できないようです。
-- この質問はEclipse フォーラムでも尋ねられました - 動的メニューの貢献
- - - アップデート
私は今まで別のアプローチを試みました:
メニューに HandledToolItem を追加しました (次の画像を参照してください)。
次のコードを使用して、コードが担当者によって呼び出されるメニューのビルド方法を妨害しようとしています。イメージで参照されているコマンド ハンドラ。
@CanExecute
public boolean canExecute(@Optional MApplication application) {
System.out.println("CanExecute Counter="+counter);
// --- 1 ---
// Find the required MMenu Entry in the Application Model
if(application == null) return true;
EModelService modelService = (EModelService) application.getContext().get(EModelService.class.getName());
MPart part = (MPart) modelService.find("at.medevit.emr.contacts.ui.contactselector", application);
List<MToolBarElement> lmte = part.getToolbar().getChildren();
HandledToolItemImpl htil = null;
for (MToolBarElement mToolBarElement : lmte) {
if(mToolBarElement.getElementId().equals("at.medevit.emr.contacts.ui.contactselector.toolbar.handledtoolitem.filter")) htil = (HandledToolItemImpl) mToolBarElement;
}
if(htil != null) {
MMenu elemMenu = htil.getMenu();
// --- 2 ---
// Found it hopefully, let's start the real work, simply add a new item
MDirectMenuItem mdi = MMenuFactory.INSTANCE.createDirectMenuItem();
mdi.setLabel("Counter "+counter);
counter++;
// --- 3 ---
elemMenu.getChildren().add(mdi); // ConcurrentModificationException
}
ご覧のとおり、コマンドが実行可能かどうかを判断するために、メニューが作成されるとこのコードが照会されます。1 から 2 までのすべてのコードは、作業する正しい MMenu 要素を見つけるためのものです。2 ~ 3 のコードは、MenuItem を作成し、フィールドのカウンターをインクリメントします。
しかし 3 で、メニューが初めて開かれたときにjava.util.ConcurrentModificationExceptionに直面しました! まさにこの時点で、メニューが elemMenu.getChildren() を繰り返し処理していて、有効にすることは許可されていないと思います!
だから、e4モデル全体がいつでも変更可能であることについてのすべての混乱は何ですか;)(冗談です、これはひどいハックだと知っています!!!)
つまり、完全に動的なメニュー パーツを追加できる可能性は、最高のユーザビリティ ツールの 1 つだと本当に思います。E3 のように E4 でそれを実現できない場合、これは非常に深刻な可能性の低下です!!!
- アップデート
このhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=389063に対して Eclipse のバグが報告されています。