2015-07-24 3 views
0

У меня есть редактор в RCP Program, который содержит TableViewer. Содержимое TableViewer может быть обновлено в результате Action в редакторе. Это в настоящее время осуществляется путем создания нового ввода и вызоваJFace TableViewer - как правильно fireSelectionChanged() после вызова setInput (...)?

tableViewer.setInput(updatedInput); 

К сожалению, это не посылает SelectionChangedEvent пока либо редактор не теряет фокус или новый выбор сделан в таблице. Это приводит к неприятностям в Command, который получает текущий выбор через HandlerUtil.getCurrentSelection(event) -

ISelection oldSelection = tableViewer.getSelection(); 
Collection<Foo> newFoos = fooAction.createNewFoos(); 
tableViewer.setInput(newFoos); 
... 
...//call an action. 
...//Inside the action: 
Collection<Foo> selectedFoos = HandlerUtil.getCurrentSelection(event).toList(); 
//No good! We get the unchanged selection back! 

Я вижу два пути решения этой проблемы. Итерация через вход и настройка существующих объектов вместо вызова setInput(), вероятно, будет работать, но в моем случае это не вариант. Вместо этого я хочу вызвать SelectionChangedEvent, который получит HandlerUtil, чтобы обновить его переменную currentSelection. В настоящее время я получаю, чтобы это произошло, как это:

ISelection oldSelection = tableViewer.getSelection(); 
Collection<Foo> newFoos = fooAction.createNewFoos(); 
tableViewer.setInput(newFoos); 
ISelection selection = tableViewer.getSelection(); 
tableViewer.setSelection(null); 
tableViewer.setSelection(selection); 

Это работает, так как изменения выбора, какие силы события, чтобы быть отстреливается. Но это также уродливый взлом, и даже с комментарием я думаю, что это потенциально может смутить любого, кто смотрит на этот кусок кода в будущем.

Так что со всем этим в стороне, есть ли способ получить TableViewer для стрельбы SelectionChangedEvent? Могу ли я заставить это автоматически произойти с правильным ContentProvider? Или я могу как-то выполнить это, уволив изменение свойства из представления или редактора?

Любые советы были бы высоко оценены!

ответ

1

Что вы показываете это хорошо, за исключением, что вы должны установить выделение на пустой, а не нуль с:

tableViewer.setSelection(StructuredSelection.EMPTY); 
Смежные вопросы