2015-07-14 7 views
0

У меня есть меню в главном меню в проекте Eclipse 4 Application, чьи дети внесли вклад с помощью фрагментов из разных плагинов. Я применил разрешения для подменю в соответствии с зарегистрированным пользователем. Моя проблема даже после того, как никакое подменю меню не имеет разрешения, и ни одно из них не отображается, но все же отображается меню. Я хочу скрыть это меню. Какие-либо предложения.Как скрыть меню, чьи дети скрыты?

Update: Мой класс для модели процессора и plugin.xml

public class MenuProcessor { 
    public MenuProcessor(){} 
    @Execute 
    public void execute(@Named("application_luna.menu.contract(fo)") MMenu menu) 
    { 
    if(menu.getChildren().isEmpty()) 
     menu.setVisible(false); 
    } 
} 
<extension 
    id="com.swte.approval.ui.fragment" 
    point="org.eclipse.e4.workbench.model"> 
    <fragment 
     uri="fragment.e4xmi"> 
    </fragment> 
    <processor 
     apply="always" 
     beforefragment="false" 
     class="com.swte.approval.ui.MenuProcessor1"> 
    <element 
    id="application_luna.menu.contract(fo)"> 
    </element> 
</processor> 

`

ответ

0

Вы могли бы сделать это с processor в меню.

Вы объявляете процессор в файле plugin.xml как часть точки расширения org.eclipse.e4.workbench.model.

<extension 
    id="playerFragment" 
    point="org.eclipse.e4.workbench.model"> 
    ... other elmeents 
    <processor 
     beforefragment="false" 
     class="package.MenuProcessor"> 
    <element 
      id="menu.id"> 
    </element> 
    </processor> 
</extension> 

Объявление объявляет класс для запуска и элемент модели, к которому он относится.

Код процессора затем может вставлять именованное меню и сделать его невидимым, если нет детей. Нечто подобное (не проверено):

public class MenuProcessor 
{ 
    @Inject @Named("menu.id") 
    private MMenu menu; 

    @Execute 
    public void execute() 
    { 
    if (menu.getChildren().isEmpty()) 
     menu.setVisible(false); 
    } 

Примечание: необходимо вводить элемент меню в качестве поля в классе, указав его в качестве параметра по методу execute не будет работать. Это связано с тем, что элемент доступен только для инъекций, когда класс построен.

+0

Сэр, я получаю следующее сообщение: Не удалось обработать «MenuProcessor.menu»: фактического значения для аргумента «MMenu [@ javax.inject.Named (value = application_luna.menu.contract (fo)) не найдено ...] «где MenuProcessor - это класс процессора –

+0

Ну, я позаботился об исключении, но я думаю, что процессор модели никогда не выполняется. Я попробовал что-то напечатать. Какие-либо предложения. –

+0

Здесь работает тонкое тестирование. Вам нужно будет показать нам свой код. –