Как прослушать изменения выбора в TableViewer?

Я работаю над RCP-приложением Eclipse и пытаюсь обновить значение выражения, предоставленное MySourceProvider, в соответствии с изменениями выбора в TableViewer в MyEditorPart.

Экземпляр MyEditorPart определяет TableViewer следующим образом:

public class MyEditorPart extends EditorPart {  

@Override
public void createPartControl(Composite parent) {  

  TableViewer tableviewer = new TableViewer(parent, SWT.CHECK);
  tableviewer.setContentProvider(ArrayContentProvider.getInstance());
  getSite().setSelectionProvider(tableViewer);  

...

MySourceProvider имеют некоторые значения выражений, подобные этому:

public class MySourceProvider extends AbstractSourceProvider {

public static final String EXPR = "org.xyz.isEntrySelected";
// other expressions

@Override
public String[] getProvidedSourceNames() {
  return new String[] { EXPR,
  // other expressions
  };
}

@Override
public Map getCurrentState() {
  HashMap<String, Object> map = new HashMap<String, Object>(1);
  map.put(EXPR, expr_value); // expr_value calculated by the listener
  // other expressions
  return map;
}

Я хочу изменить expr_value в соответствии с изменениями выбора на TableViewer. Я зарегистрировал слушателя следующим образом:

window.getSelectionService().addPostSelectionListener(MyEditorPartId, selectionListener);  
private final ISelectionListener selectionListener = new  SelectionListener() {
    @Override
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
        handleEvent();
    }
};

Слушатель успешно регистрируется, но получает уведомление только один раз, если я нажал где-нибудь на MyEditorPart (не только TableViewer, но и на весь редактор). Чтобы получить уведомление снова, мне нужно щелкнуть другую часть представления (или редактора), чтобы потерять фокус, а затем снова щелкнуть MyEditorPart.

1. Почему прослушиватель получает уведомление только один раз, когда MyEditorPart снова получает фокус?
2. Как прослушивать только изменения выбора до TableViewer строк?

Что мне здесь не хватает? Каков правильный способ прослушивания изменений выбора?

Заранее спасибо.


person emrekgn    schedule 05.11.2015    source источник


Ответы (2)


Вам нужен не SelectionListener, а SelectionChangedListener.

При этом вы можете написать следующий код:

viewer.addSelectionChangedListener(new ISelectionChangedListener() {
  @Override
  public void selectionChanged(SelectionChangedEvent event) {
    IStructuredSelection selection = viewer.getStructuredSelection();
    Object firstElement = selection.getFirstElement();
    // do something with it
  }
}); 
person Gergely Bacso    schedule 05.11.2015
comment
Я понимаю, но мне нужно создать прослушиватель в другом классе MySourceProvider, поэтому я пытаюсь использовать getSelectionService().addPostSelectionListener(), а этот метод принимает только ISelectionListener? Вместо этого я должен использовать ваше решение с EventBroker для уведомления MySourceProvider? - person emrekgn; 05.11.2015
comment
Скорее всего, вам нужна простая функция обратного вызова. Старайтесь не усложнять вещи с помощью трюков JFace. Если действие, на которое вы хотите ответить, — это выбор пользователем элемента в таблице, то вам нужен слушатель JFace selectionChangedListener. С этого момента все остальное — это обмен ссылками и вызов методов, которые вы написали. - person Gergely Bacso; 05.11.2015

Похоже, что эта форма addPostSelectionListener срабатывает только тогда, когда часть становится активной. Использовать:

addPostSelectionListener(ISelectionListener listener)

форма слушателя, которая вызывается для каждого изменения выбора.

Затем вы можете проверить идентификатор IWorkbenchPart в слушателе:

@Override
public void selectionChanged(final IWorkbenchPart part, final ISelection selection)
{
  if (MyEditorPartId.equals(part.getSite().getId()))
   {
     // your code
   }
}
person greg-449    schedule 05.11.2015
comment
Я пробовал это, но, к сожалению, у него та же проблема, он срабатывает только один раз. Простите мой глупый вопрос, но примеры, которые я нашел, всегда используют этот слушатель - механизм selectionprovider из ViewPart, интересно, имеет ли это какое-то отношение к использованию EditorPart? Потому что у меня есть несколько классов ViewPart, которые используют этот механизм, и они просто отлично работают. - person emrekgn; 05.11.2015