Я немного застрял, потому что ресурсов много, и они не раскрывают эту проблему для меня.Возможность включения обработчика 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.
}
}
Интересный выбор параметров включения. Как «итерация» и «адаптация» пригодится в этом случае? – GGrec
Если дерево/таблица позволяет выбрать несколько элементов, «итерация» поочередно смотрит на каждый выбор, поэтому с 'или', указанным только один из вариантов, должен совпадать. 'adapt' использует интерфейс' IAdapterFactory' для соответствия указанному типу с выбранным объектом (поэтому объекту пользовательского интерфейса не нужно напрямую реализовывать интерфейс). –
Отличное объяснение. Теперь у меня есть еще один вопрос. Почему постоянно тестируются тестеры свойств? Если у меня есть несколько бизнес-логик в методе 'test', разве это не замедлит всю систему? – GGrec