2014-01-09 2 views
0

Я немного застрял, потому что ресурсов много, и они не раскрывают эту проблему для меня.Возможность включения обработчика Eclipse RCP на основе выбора

Пусть у меня есть команду, а обработчик, свойства тестер, и результат этих представленный на пользовательском интерфейсе в виде Coolbar элемента.

Теперь предположим, что у меня есть несколько видов, расширяющих одно и то же основание (например, BaseView). Все эти представления содержат ColumnViewer s (например, TableViewer, TreeViewer), которые действуют как поставщиков выбора.

  • Как в enableWhen и activeWhen конфигурации знают о выборе в тех зрителей? Я не могу себе представить, как работают параметры selection + instanceOf для ISelection (s).
  • Как отобранный объект передается тестеру свойств? В каком экземпляре принимают метод test (как receiver)?
  • Я заметил с точкой останова, что есть много проходов через метод обработчика setEnabled(). Это нормальное поведение? Было бы нормально переопределить setEnabled?

Код кажется немного неуместным для меня здесь. Но в любом случае, эти фрагменты охватывают вопросы:

// --------------------- 1 ----------------------- 

    <handler 
     class="com.example.ggrec.handlers.SampleHandler" 
     commandId="com.example.ggrec.commands.sampleCommand"> 
    <enabledWhen> 
     <with 
       variable="selection"> 
      <instanceof 
       value="org.eclipse.jface.viewers.ISelection"> 
      </instanceof> 
     </with> 
    </enabledWhen> 
    </handler> 

// --------------------- 2 ----------------------- 

    <propertyTester 
     class="com.example.ggrec.propertyTesters.SamplePropertyTester" 
     id="com.example.ggrec.samplePropertyTester" 
     namespace="com.example.ggrec.propertyTesters" 
     properties="simpleTest" 
     type="java.lang.Object"> 
    </propertyTester> 

// --------------------- 3 ----------------------- 

/** 
* 
* @author ggrec 
* 
*/ 
public class SamplePropertyTester extends PropertyTester 
{ 
    @Override 
    public boolean test(final Object receiver, final String property, final Object[] args, final Object expectedValue) 
    { 
     if (receiver instanceof ISelection) // What instance is this? 
      System.out.println("RAINBOWS"); 

     return true; 
    } 
} 

// --------------------- 4 ----------------------- 

/** 
* 
* @author ggrec 
* 
*/ 
public class SampleHandler extends AbstractHandler 
{ 
    @Override 
    public Object execute(final ExecutionEvent event) throws ExecutionException 
    { 
     final IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); 
     MessageDialog.openInformation(window.getShell(), "", "meh"); 

     return null; 
    } 

    @Override 
    public void setEnabled(final Object evaluationContext) 
    { 
     super.setEnabled(evaluationContext); // Goes like crazy through here. 
    } 
} 

ответ

1

Каждого ViewPart (и редактор часть) имеет отдельный выбор поддерживается службой выбора и установок ваших поставщиков выбора. enabledWhen и visibleWhen используйте выбор для текущей активной части, полученной в службе выбора для детали.

Звонки на тестирование свойств обычно находятся внутри блока <with> в выражении включения, которое устанавливает тестируемый объект. Что-то вроде:

<with 
    variable="org.eclipse.ui.selection"> 
    <iterate 
     operator="or"> 
     <adapt 
      type="music.resources.data.IMusicFile"> 
      <or> 
       <test property="music.isMusicOrPlaylist"/> 
       <test property="music.isVideo"/> 
      </or> 
     </adapt> 
    </iterate> 
</with> 

, который работает с текущим выбором, требующий выбором, чтобы адаптироваться к определенному типу, и тестирование любому из двух свойств.

+0

Интересный выбор параметров включения. Как «итерация» и «адаптация» пригодится в этом случае? – GGrec

+0

Если дерево/таблица позволяет выбрать несколько элементов, «итерация» поочередно смотрит на каждый выбор, поэтому с 'или', указанным только один из вариантов, должен совпадать. 'adapt' использует интерфейс' IAdapterFactory' для соответствия указанному типу с выбранным объектом (поэтому объекту пользовательского интерфейса не нужно напрямую реализовывать интерфейс). –

+0

Отличное объяснение. Теперь у меня есть еще один вопрос. Почему постоянно тестируются тестеры свойств? Если у меня есть несколько бизнес-логик в методе 'test', разве это не замедлит всю систему? – GGrec

Смежные вопросы