eclipseeclipse-pluginjfacetreeviewer

setSelectionProvider over two different controls not working


I am Trying to create Eclipse Plugin which has a composite with two TreeViewer side by side. On click of each TreeViewer content Eclipse property view should give appropriate information. Now I wanted to set Selection provider for both of this treeviewer hence I used

  setSelectionProvider(treeViewer1)
  setSelectionProvider(treeviewer2)

But only the second added treeviewer get set since the first one is overwritten. I am intiating this two treeviewer from class Queue.java. Hence I implemented the interface ISelectionProvider over Queue.java as below:

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);
   } 

Can anyone help me how to resolve this issue. I will be grateful. thanks in advance. Tor.


Solution

  • Your view would have to write a selection provider wrapper or mediator that would delegate to the viewer that currently had focus. Then your view would set it up something like this:

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

    I would check out org.eclipse.jdt.internal.ui.viewsupport.SelectionProviderMediator for an example of a selection provider for multiple JFace viewers.