setSelectionProvider над двумя разными элементами управления не работает

Я пытаюсь создать плагин Eclipse, в котором есть композит с двумя TreeViewer рядом. При щелчке по каждому TreeViewer содержимому представление свойств Eclipse должно предоставлять соответствующую информацию. Теперь я хотел установить поставщика выбора для обоих этих средств просмотра дерева, поэтому я использовал

  setSelectionProvider(treeViewer1)
  setSelectionProvider(treeviewer2)

Но устанавливается только второй добавленный просмотрщик дерева, так как первый перезаписывается. Я запускаю эти два средства просмотра деревьев из класса Queue.java. Поэтому я реализовал интерфейс ISelectionProvider поверх Queue.java, как показано ниже:

public void addSelectionChangedListener(ISelectionChangedListener listener)
{
  selectionChangedListeners.add(listener);
}

public void
    removeSelectionChangedListener(ISelectionChangedListener listener)
{
  selectionChangedListeners.remove(listener);
}

private void fireSelectionChanged(final SelectionChangedEvent event)
{
  Object[] listeners = selectionChangedListeners.getListeners();
  for (int i = 0; i < listeners.length; ++i)
  {
     final ISelectionChangedListener l =
         (ISelectionChangedListener) listeners[i];
     Platform.run(new SafeRunnable()
     {
        public void run()
        {
           l.selectionChanged(event);
        }

        @Override
        public void handleException(Throwable e)
        {
           removeSelectionChangedListener(l);
        }
     });
   }
}

   public void setSelection(ISelection selection)
   {
       fireSelectionChanged(new SelectionChangedEvent(this, selection));
    }

     public ISelection getSelection()
    {
      ArrayList<Object> list = new ArrayList<Object>();
     Object o = getProperties();
     if (o instanceof IPropertySource)
         list.add(o);
     return new StructuredSelection(list);
   } 

Может ли кто-нибудь помочь мне, как решить эту проблему. буду благодарен. заранее спасибо. Тор.


person tor    schedule 15.05.2012    source источник


Ответы (1)


Ваше представление должно было бы написать оболочку поставщика выбора или посредник, который делегировал бы средство просмотра, которое в настоящее время имеет фокус. Тогда ваше представление настроит его примерно так:

SelectionProviderWrapper wrapper = new SelectionProviderWrapper();
wrapper.addViewer(treeViewer1);
wrapper.addViewer(treeViewer2);
getSite().setSelectionProvider(wrapper);

Я бы проверил org.eclipse.jdt.internal.ui.viewsupport.SelectionProviderMediator для примера поставщика выбора для нескольких средств просмотра JFace.

person Paul Webster    schedule 15.05.2012
comment
Спасибо, Пол ... это то, что я искал последние два дня ... Но я все еще не понимаю, каким должен быть код в функции addViewer (), указанной вами? - person tor; 15.05.2012
comment
Вы просто сообщаете обертке, какие представления ей важны. В примере кода, на который я ссылался, похоже, что вместо этого они просто указывают его в конструкторе. - person Paul Webster; 15.05.2012