Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Programmatically Fire a RCP Selection Event

In my Eclipse RCP application I use the Selection Service as described in this nice article. There is a TreeViewer in one view registered as a SelectionProvider:

getSite().setSelectionProvider(viewer);

Another view is receiving the events from the TreeViewer:

selectionListener = new ISelectionListener() {
  public void selectionChanged(IWorkbenchPart part, ISelection selection) {
    pageSelectionChanged(part, selection);
  }
 };
 getSite().getPage().addSelectionListener(selectionListener);

Everything works fine, if the events are triggered my normal mouse clicks. I would like to programmatically fire a selection events by selection an item in the tree:

treeViewer.setSelection(new StructuredSelection(element),true);

This is not working. Method selectionChanged is not called in the receiver-view. The issue is discussed in this forum thread. There is no solution.

EDIT

There is no proper way to handle a mouse triggered click the same way as a programmatically selection. A mouse click activates the view a programmatically selection does not.

My Solution is to register the second view the same way by Selection Service as the first view. After that both view are getting selection events directly from the active editor.

like image 775
uı6ʎɹnɯ ꞁəıuɐp Avatar asked Feb 01 '12 19:02

uı6ʎɹnɯ ꞁəıuɐp


4 Answers

You can do two things:

1) do the selection and then call notify listeners for an SWT.SELECTION i.e. :

mybutton.setSelection(true);
mybutton.notifyListeners(SWT.Selection, new Event());

The notifyListener method is intented to be used for custom controls so to be more correct you could do option number 2.

2) call the method that you call in your listener i.e.:

this.myButton.addSelectionListener(new SelectionListener() {
    public void widgetSelected(final SelectionEvent e) {
      doSomethingaboutTheSelMethod();
 }

In this case you can call:

doSomethingaboutTheSelMethod();
like image 153
user847988 Avatar answered Nov 06 '22 14:11

user847988


I've just had this problem and solved it like this:

treeViewer.getControl.setFocus();
treeViewer.setSelection(new StructuredSelection(element),true);

Giving the focus to the tree before making the selection seemed to notify the listeners, where before it was not.

like image 36
Link19 Avatar answered Nov 06 '22 13:11

Link19


I had the same problem. The workaround I used was to trigger the event on the Listener programmatic-ally after calling the treeViewer.getTree().select(treeViewer.getTree().getItem(0)); method.

  1. Query the listeners registered on the Tree and get a reference to your listener:

    org.eclipse.swt.widgets.Listener[] listeners = treeViewer.getTree().getListeners(SWT.Selection);
    for (int i=0; i<listeners.length; i++) {
            if (listeners[i] instanceof TypedListener) {
                if (((TypedListener)listeners[i]).getEventListener() instanceof TreeSelectionListener){
                      // Step 2: Fire the event code goes here
     }}}
    
  2. Create a SelectionEvent and trigger the selection by manually calling the widgetSelected method:

    Event underlyingEvent = new Event();
    underlyingEvent.widget = treeViewer.getTree();
    SelectionEvent selectionEvent = new SelectionEvent(underlyingEvent);
    ((TreeSelectionListener)((TypedListener)listeners[i]).getEventListener()).widgetSelected(selectionEvent);
    

This solution worked fine for me. Hope it does for you.

like image 2
ALYS Avatar answered Nov 06 '22 14:11

ALYS


Try to do a

treeViewer.fireSelectionChanged();

or

treeViewer.firePostSelectionChanged();

after setting the selection.


EDIT

Ok, so the above calls doesn't work... If you are desperate enough you could trace through the sources and find out what actually calls selectionChanged(). Just set a breakpoint in your method and get up the stack. Maybe you get an idea of how to achieve this call on another way.

like image 1
Kai Avatar answered Nov 06 '22 13:11

Kai