5

この機能は Kepler M4 で実現されました。使用方法の詳細については、私のブログを参照してください。

ビュー ツールバーにあるハンドラーのメニューへの完全に動的なメニューの貢献を実現したいと考えています。Eclipse 3 では、メニューへの org.eclipse.ui.menus の貢献として「動的」を追加することが可能でした!

私はすでにwww.vogella.com/blog/2010/10/26/processors-e4-modelで、プロセッサ モデルの拡張によってメニューに動的に貢献する方法を説明していることを知りましたが、変更される完全に動的なメニューの実装について話しているのです。担当者のすべての呼び出しで。サブメニュー。前述のように、動的メニューの提供と isDynamic() を true に設定することにより、これは Eclipse 3.x で実現するのに問題はありませんでした。

私はすでにいくつかのアプローチを試しました:

未経験のオープンなソリューション

  • 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 のバグが報告されています。

4

1 に答える 1

2

適切な動的モデルの更新は、開いたバグで処理する必要があります。JunoのEclipse4での回避策として、MRenderedMenuItemをEclipse4で作成して、動的要素と同等の機能を提供できます(ただし、4.2を使用している場合は、org.eclipse.ui.menusを使用するだけです)。

元:

ContextFunction generator = new ContextFunction() {
    @Override
    public Object compute(IEclipseContext context) {
        return new MyCompoundContributionItem(context);
    }
};

MRenderedMenuItem menuItem = MenuFactoryImpl.eINSTANCE.createRenderedMenuItem();
menuItem.setElementId(id);
menuItem.setContributionItem(generator);
container.getChildren().add(menuItem);

これにより、CompoundContributionItemがEclipse4メニューレンダラーに直接効果的に提供されます。

于 2012-09-10T14:41:05.817 に答える