2017-03-06 7 views
0

RAP e4アプリケーションのポップアップメニューの動的サブメニューを作成しています。メニューには、同じコマンドを使用しているが、異なるコマンドパラメータを使用して、1つまたは複数の処理されたメニュー項目が含まれています。私はこのコマンドのハンドラも書いていますが、これまでは何もせずにパラメータ値を記録することになっています。eclipse RAP:動的なHandledメニュー項目が@CanExecuteを呼び出せるが、@Executeは呼び出せない理由

@AboutToShow 
public void aboutToShow(List<MMenuElement> items, MPart part, MApplication app) { 
    AnnotationEditorPart aEPart = (AnnotationEditorPart) part.getObject(); 
    List<IAnnotationElement> elements = aEPart.getGrid().getElementsOfCurrentlySelectedCategory(); 
    String catName = ""; 
    if (aEPart.getGrid().getCurrentlySelectedCategory() != null) { 
     catName = aEPart.getGrid().getCurrentlySelectedCategory().getName(); 
    } 

    MMenu subMenu = MMenuFactory.INSTANCE.createMenu(); 
    subMenu.setLabel("Add Element..."); 
    items.add(subMenu); 

    if (catName.equals("")) { 
     //Not a category 
     return; 
    } 

    for (IAnnotationElement element: elements) { 
     if (element.isToBeDisplayed()) { 
      continue; 
     } 

     MHandledMenuItem dynamicItem = MMenuFactory.INSTANCE.createHandledMenuItem(); 
     dynamicItem.setLabel(element.getName()); 
     dynamicItem.setContributorURI("platform:/plugin/org.bgbm.annosys.ui"); 

     MCommand command = app.getCommand(COMMAND_ID); 

     dynamicItem.setCommand(command); 

     MParameter parameter = MCommandsFactory.INSTANCE.createParameter(); 
     parameter.setName("org.bgbm.annosys.ui.commandparameter.annotationElementToAddToCategory"); 
     parameter.setValue(element.getName()); 
     dynamicItem.getParameters().add(parameter); 

     MParameter parameter2 = MCommandsFactory.INSTANCE.createParameter(); 
     parameter2.setName("org.bgbm.annosys.ui.commandparameter.annotationCategoryToAddElementTo"); 
     parameter2.setValue(catName); 
     dynamicItem.getParameters().add(parameter2); 

     subMenu.getChildren().add(dynamicItem); 

     dynamicItem.setEnabled(true); 
     dynamicItem.setCommand(command); 
    } 
} 

は基本的に、私は要素のリストを取得し、選択したカテゴリにその要素を追加するために、各要素についてmenutアイテムを作成:

はここでサブメニューを作成するコードです。私が必要とするのは、カテゴリの名前と要素の名前だけなので、それらをコマンドパラメータに入れます。

この種の作品。ここにハンドラがあります:

package org.bgbm.annosys.ui.application.parts.handlers; 

import javax.inject.Named; 

import org.bgbm.annosys.logging.Logger; 
import org.eclipse.e4.core.di.annotations.CanExecute; 
import org.eclipse.e4.core.di.annotations.Execute; 

public class AddAnnotationElementToCategoryCommandHandler { 

    /** Default {@link Logger} instance of this class */ 
    final static Logger logger = Logger.getLogger(); 

    @Execute 
    public void execute(@Named("org.bgbm.annosys.ui.commandparameter.annotationElementToAddToCategory") String elementName, 
      @Named("org.bgbm.annosys.ui.commandparameter.annotationCategoryToAddElementTo") String categoryName) { 
     logger.debug("#### clicked: " + elementName + ", " + categoryName); 
    } 

    @CanExecute 
    public boolean canExecute(@Named("org.bgbm.annosys.ui.commandparameter.annotationElementToAddToCategory") String elementName, 
      @Named("org.bgbm.annosys.ui.commandparameter.annotationCategoryToAddElementTo") String categoryName) { 
     logger.debug(elementName + ", " + categoryName); 
     return true; 
    } 

} 

興味深いことは、canExecuteが明確にトリガすることです。私はコンソールに期待される結果を得て、真か偽かによってアイテムはいつものように有効または無効になります。

ただし、このアイテムをクリックすると、全く反応しません。ログに何もないので、私がexecute関数に入れた他のコードも同様に無視されます。このメソッドは単に呼び出されることはありません。

この理由は何ですか?

編集:
私は今、ダイナミックメニュー項目にコマンドを結びつけるいくつかの方法を試しましたが、結果は変わりません。 私は、メニュー項目選択の瞬間にブレークポイントでこれをデバッグしたいと思いますが、フレームワークがメニュー関数全体を処理し、実行メソッドが呼び出されないので、ブレークポイントがどこに行かなければならないのかわかりません。

多分、誰かが私を助けることができるでしょうか?

答えて

0

さまざまなinvoke(...)メソッドの条件付きブレークポイントをorg.eclipse.e4.core.contexts.ContextInjectionFactory(条件はqualifier == org.eclipse.e4.core.di.annotations.Execute.classなど)に設定できます。

さらにフレームワークの内部に行きたい場合は、org.eclipse.e4.core.di.annotations.Executeが参照されている場所を確認して、その参照トレイルに従うと、おそらくメニューアイテムレンダラーにつながります。

関連する問題